Dune Core Modules (2.9.0)

axisalignedcubegeometry.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 // SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
4 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5 
6 #ifndef DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
7 #define DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
8 
13 #include <bitset>
14 
15 #include <dune/common/fvector.hh>
16 #include <dune/common/fmatrix.hh>
18 
19 #include <dune/geometry/referenceelements.hh>
20 #include <dune/geometry/type.hh>
21 
22 
23 namespace Dune {
24 
48  template <class CoordType, unsigned int dim, unsigned int coorddim>
50  {
51 
52 
53  public:
54 
56  constexpr static int mydimension = dim;
57 
59  constexpr static int coorddimension = coorddim;
60 
62  typedef CoordType ctype;
63 
66 
69 
71  typedef ctype Volume;
72 
79  typedef typename std::conditional<dim==coorddim,
82 
89  typedef typename std::conditional<dim==coorddim,
92 
100  using Jacobian = std::conditional_t<dim==coorddim, DiagonalMatrix<ctype,dim>, FieldMatrix<ctype,coorddim,dim> >;
101 
109  using JacobianInverse = std::conditional_t<dim==coorddim, DiagonalMatrix<ctype,dim>, FieldMatrix<ctype,dim,coorddim> >;
110 
117  : lower_(lower),
118  upper_(upper),
119  axes_()
120  {
121  static_assert(dim==coorddim, "Use this constructor only if dim==coorddim!");
122  // all 'true', but is never actually used
123  axes_ = (1<<coorddim)-1;
124  }
125 
135  const std::bitset<coorddim>& axes)
136  : lower_(lower),
137  upper_(upper),
138  axes_(axes)
139  {
140  assert(axes.count()==dim);
141  for (size_t i=0; i<coorddim; i++)
142  if (not axes_[i])
143  upper_[i] = lower_[i];
144  }
145 
151  : lower_(lower)
152  {}
153 
156  {
157  return GeometryTypes::cube(dim);
158  }
159 
162  {
163  GlobalCoordinate result;
164  if (dim == coorddim) { // fast case
165  for (size_t i=0; i<coorddim; i++)
166  result[i] = lower_[i] + local[i]*(upper_[i] - lower_[i]);
167  } else if (dim == 0) { // a vertex -- the other fast case
168  result = lower_; // hope for named-return-type-optimization
169  } else { // slow case
170  size_t lc=0;
171  for (size_t i=0; i<coorddim; i++)
172  result[i] = (axes_[i])
173  ? lower_[i] + local[lc++]*(upper_[i] - lower_[i])
174  : lower_[i];
175  }
176  return result;
177  }
178 
181  {
182  LocalCoordinate result;
183  if (dim == coorddim) { // fast case
184  for (size_t i=0; i<dim; i++)
185  result[i] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
186  } else if (dim != 0) { // slow case
187  size_t lc=0;
188  for (size_t i=0; i<coorddim; i++)
189  if (axes_[i])
190  result[lc++] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
191  }
192  return result;
193  }
194 
197  {
198  JacobianTransposed result;
199 
200  // Actually compute the result. Uses different methods depending
201  // on what kind of matrix JacobianTransposed is.
202  jacobianTransposed(result);
203 
204  return result;
205  }
206 
209  {
211 
212  // Actually compute the result. Uses different methods depending
213  // on what kind of matrix JacobianTransposed is.
215 
216  return result;
217  }
218 
220  Jacobian jacobian([[maybe_unused]] const LocalCoordinate& local) const
221  {
222  return jacobianTransposed(local).transposed();
223  }
224 
226  JacobianInverse jacobianInverse([[maybe_unused]] const LocalCoordinate& local) const
227  {
228  return jacobianInverseTransposed(local).transposed();
229  }
230 
234  Volume integrationElement([[maybe_unused]] const LocalCoordinate& local) const
235  {
236  return volume();
237  }
238 
241  {
242  GlobalCoordinate result;
243  if (dim==0)
244  result = lower_;
245  else {
246  // Since lower_==upper_ for unused coordinates, this always does the right thing
247  for (size_t i=0; i<coorddim; i++)
248  result[i] = CoordType(0.5) * (lower_[i] + upper_[i]);
249  }
250  return result;
251  }
252 
254  int corners() const
255  {
256  return 1<<dim;
257  }
258 
261  {
262  GlobalCoordinate result;
263  if (dim == coorddim) { // fast case
264  for (size_t i=0; i<coorddim; i++)
265  result[i] = (k & (1<<i)) ? upper_[i] : lower_[i];
266  } else if (dim == 0) { // vertex
267  result = lower_; // rely on named return-type optimization
268  } else { // slow case
269  unsigned int mask = 1;
270 
271  for (size_t i=0; i<coorddim; i++) {
272  if (not axes_[i])
273  result[i] = lower_[i];
274  else {
275  result[i] = (k & mask) ? upper_[i] : lower_[i];
276  mask = (mask<<1);
277  }
278  }
279  }
280 
281 
282  return result;
283  }
284 
286  Volume volume() const
287  {
288  ctype vol = 1;
289  if (dim == coorddim) { // fast case
290  for (size_t i=0; i<dim; i++)
291  vol *= upper_[i] - lower_[i];
292  // do nothing if dim == 0
293  } else if (dim != 0) { // slow case
294  for (size_t i=0; i<coorddim; i++)
295  if (axes_[i])
296  vol *= upper_[i] - lower_[i];
297  }
298  return vol;
299  }
300 
302  bool affine() const
303  {
304  return true;
305  }
306 
307  friend Dune::Transitional::ReferenceElement< ctype, Dim<dim> > referenceElement ( const AxisAlignedCubeGeometry & /* geometry */ )
308  {
310  }
311 
312  private:
313  // jacobianTransposed: fast case --> diagonal matrix
314  void jacobianTransposed ( DiagonalMatrix<ctype,dim> &jacobianTransposed ) const
315  {
316  for (size_t i=0; i<dim; i++)
317  jacobianTransposed.diagonal()[i] = upper_[i] - lower_[i];
318  }
319 
320  // jacobianTransposed: slow case --> dense matrix
321  void jacobianTransposed ( FieldMatrix<ctype,dim,coorddim> &jacobianTransposed ) const
322  {
323  if (dim==0)
324  return;
325 
326  size_t lc = 0;
327  for (size_t i=0; i<coorddim; i++)
328  if (axes_[i])
329  jacobianTransposed[lc++][i] = upper_[i] - lower_[i];
330  }
331 
332  // jacobianInverseTransposed: fast case --> diagonal matrix
333  void jacobianInverseTransposed ( DiagonalMatrix<ctype,dim> &jacobianInverseTransposed ) const
334  {
335  for (size_t i=0; i<dim; i++)
336  jacobianInverseTransposed.diagonal()[i] = CoordType(1.0) / (upper_[i] - lower_[i]);
337  }
338 
339  // jacobianInverseTransposed: slow case --> dense matrix
340  void jacobianInverseTransposed ( FieldMatrix<ctype,coorddim,dim> &jacobianInverseTransposed ) const
341  {
342  if (dim==0)
343  return;
344 
345  size_t lc = 0;
346  for (size_t i=0; i<coorddim; i++)
347  if (axes_[i])
348  jacobianInverseTransposed[i][lc++] = CoordType(1.0) / (upper_[i] - lower_[i]);
349  }
350 
352 
354 
355  std::bitset<coorddim> axes_;
356  };
357 
358 } // namespace Dune
359 #endif
A geometry implementation for axis-aligned hypercubes.
Definition: axisalignedcubegeometry.hh:50
Volume volume() const
Return the element volume.
Definition: axisalignedcubegeometry.hh:286
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const Dune::FieldVector< ctype, coorddim > upper, const std::bitset< coorddim > &axes)
Constructor from a lower left and an upper right corner.
Definition: axisalignedcubegeometry.hh:133
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const Dune::FieldVector< ctype, coorddim > upper)
Constructor from a lower left and an upper right corner.
Definition: axisalignedcubegeometry.hh:115
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower)
Constructor from a single point only.
Definition: axisalignedcubegeometry.hh:150
GlobalCoordinate corner(int k) const
Return world coordinates of the k-th corner of the element.
Definition: axisalignedcubegeometry.hh:260
ctype Volume
Type used for volume.
Definition: axisalignedcubegeometry.hh:71
FieldVector< ctype, dim > LocalCoordinate
Type used for a vector of element coordinates.
Definition: axisalignedcubegeometry.hh:65
JacobianInverseTransposed jacobianInverseTransposed([[maybe_unused]] const LocalCoordinate &local) const
Inverse Jacobian transposed of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:208
JacobianInverse jacobianInverse([[maybe_unused]] const LocalCoordinate &local) const
Inverse Jacobian of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:226
JacobianTransposed jacobianTransposed([[maybe_unused]] const LocalCoordinate &local) const
Jacobian transposed of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:196
FieldVector< ctype, coorddim > GlobalCoordinate
Type used for a vector of world coordinates.
Definition: axisalignedcubegeometry.hh:68
LocalCoordinate local(const GlobalCoordinate &global) const
Map a point in global (world) coordinates to element coordinates.
Definition: axisalignedcubegeometry.hh:180
CoordType ctype
Type used for single coordinate coefficients.
Definition: axisalignedcubegeometry.hh:62
std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, coorddim, dim > > Jacobian
Return type of jacobian.
Definition: axisalignedcubegeometry.hh:100
constexpr static int mydimension
Dimension of the cube element.
Definition: axisalignedcubegeometry.hh:56
std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, dim, coorddim > >::type JacobianTransposed
Return type of jacobianTransposed.
Definition: axisalignedcubegeometry.hh:81
GeometryType type() const
Type of the cube. Here: a hypercube of the correct dimension.
Definition: axisalignedcubegeometry.hh:155
int corners() const
Return the number of corners of the element.
Definition: axisalignedcubegeometry.hh:254
Volume integrationElement([[maybe_unused]] const LocalCoordinate &local) const
Return the integration element, i.e., the determinant term in the integral transformation formula.
Definition: axisalignedcubegeometry.hh:234
Jacobian jacobian([[maybe_unused]] const LocalCoordinate &local) const
Jacobian of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:220
constexpr static int coorddimension
Dimension of the world space that the cube element is embedded in.
Definition: axisalignedcubegeometry.hh:59
std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, coorddim, dim > >::type JacobianInverseTransposed
Return type of jacobianInverseTransposed.
Definition: axisalignedcubegeometry.hh:91
GlobalCoordinate center() const
Return center of mass of the element.
Definition: axisalignedcubegeometry.hh:240
bool affine() const
Return if the element is affine. Here: yes.
Definition: axisalignedcubegeometry.hh:302
std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, dim, coorddim > > JacobianInverse
Return type of jacobianInverse.
Definition: axisalignedcubegeometry.hh:109
GlobalCoordinate global(const LocalCoordinate &local) const
Map a point in local (element) coordinates to world coordinates.
Definition: axisalignedcubegeometry.hh:161
A diagonal matrix of static size.
Definition: diagonalmatrix.hh:53
A dense n x m matrix.
Definition: fmatrix.hh:117
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
This file implements a quadratic diagonal matrix of fixed size.
Implements a matrix constructed from a given type representing a field and compile-time given number ...
Implements a vector constructed from a given type representing a field and a compile-time given size.
unspecified-type ReferenceElement
Returns the type of reference element for the argument types T...
Definition: referenceelements.hh:417
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
Dune namespace.
Definition: alignedallocator.hh:13
static const ReferenceElement & cube()
get hypercube reference elements
Definition: referenceelements.hh:210
A unique label for each type of element that can occur in a grid.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 6, 22:30, 2024)