4 #ifndef DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
5 #define DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
13 #include <dune/common/fvector.hh>
14 #include <dune/common/fmatrix.hh>
15 #include <dune/common/diagonalmatrix.hh>
16 #include <dune/common/unused.hh>
48 template <
class CoordType,
unsigned int dim,
unsigned int coorddim>
76 typedef typename conditional<dim==coorddim,
77 DiagonalMatrix<ctype,dim>,
86 typedef typename conditional<dim==coorddim,
87 DiagonalMatrix<ctype,dim>,
95 const Dune::FieldVector<ctype,coorddim> upper)
98 axes_((1<<coorddim)-1),
99 jacobianTransposed_(0),
100 jacobianInverseTransposed_(0)
111 const Dune::FieldVector<ctype,coorddim> upper,
112 const std::bitset<coorddim>& axes)
116 jacobianTransposed_(0),
117 jacobianInverseTransposed_(0)
119 assert(axes.count()==dim);
120 for (
size_t i=0; i<coorddim; i++)
122 upper_[i] = lower_[i];
131 jacobianTransposed_(0),
132 jacobianInverseTransposed_(0)
138 lower_ = other.lower_;
139 upper_ = other.upper_;
141 jacobianTransposed_ = other.jacobianTransposed_;
142 jacobianInverseTransposed_ = other.jacobianInverseTransposed_;
156 if (dim == coorddim) {
157 for (
size_t i=0; i<coorddim; i++)
158 result[i] = lower_[i] + local[i]*(upper_[i] - lower_[i]);
163 for (
size_t i=0; i<coorddim; i++)
164 result[i] = (axes_[i])
165 ? lower_[i] + local[lc++]*(upper_[i] - lower_[i])
175 if (dim == coorddim) {
176 for (
size_t i=0; i<dim; i++)
177 result[i] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
178 }
else if (dim != 0) {
180 for (
size_t i=0; i<coorddim; i++)
182 result[lc++] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
191 return jacobianTransposed_;
198 return jacobianInverseTransposed_;
217 for (
size_t i=0; i<coorddim; i++)
218 result[i] = 0.5 * (lower_[i] + upper_[i]);
233 if (dim == coorddim) {
234 for (
size_t i=0; i<coorddim; i++)
235 result[i] = (k & (1<<i)) ? upper_[i] : lower_[i];
239 unsigned int mask = 1;
241 for (
size_t i=0; i<coorddim; i++) {
243 result[i] = lower_[i];
245 result[i] = (k & mask) ? upper_[i] : lower_[i];
259 if (dim == coorddim) {
260 for (
size_t i=0; i<dim; i++)
261 vol *= upper_[i] - lower_[i];
263 }
else if (dim != 0) {
264 for (
size_t i=0; i<coorddim; i++)
266 vol *= upper_[i] - lower_[i];
281 for (
size_t i=0; i<dim; i++)
282 jacobianTransposed.diagonal()[i] = upper_[i] - lower_[i];
292 for (
size_t i=0; i<coorddim; i++)
294 jacobianTransposed[lc++][i] = upper_[i] - lower_[i];
300 for (
size_t i=0; i<dim; i++)
301 jacobianInverseTransposed.diagonal()[i] = 1.0 / (upper_[i] - lower_[i]);
311 for (
size_t i=0; i<coorddim; i++)
313 jacobianInverseTransposed[i][lc++] = 1.0 / (upper_[i] - lower_[i]);
316 Dune::FieldVector<ctype,coorddim> lower_;
318 Dune::FieldVector<ctype,coorddim> upper_;
320 std::bitset<coorddim> axes_;