/usr/include/dune/grid/yaspgrid/yaspgridgeometry.hh is in libdune-grid-dev 2.3.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_GRID_YASPGRIDGEOMETRY_HH
#define DUNE_GRID_YASPGRIDGEOMETRY_HH
/** \file
* \brief The YaspGeometry class and its specializations
YaspGeometry realizes the concept of the geometric part of a mesh entity.
We have specializations for dim == dimworld (elements) and dim == 0
(vertices). The general version implements dim == dimworld-1 (faces)
and otherwise throws a GridError.
*/
namespace Dune {
//! The general version can do any dimension, but constructors currently exist only for dim==dimworld-1
template<int mydim,int cdim, class GridImp>
class YaspGeometry : public AxisAlignedCubeGeometry<typename GridImp::ctype,mydim,cdim>
{
public:
//! define type used for coordinates in grid module
typedef typename GridImp::ctype ctype;
//! default constructor
YaspGeometry ()
: AxisAlignedCubeGeometry<ctype,mydim,cdim>(FieldVector<ctype,cdim>(0),FieldVector<ctype,cdim>(0)) // anything
{}
//! constructor from midpoint and extension and missing direction number
YaspGeometry (const FieldVector<ctype, cdim>& p, const FieldVector<ctype, cdim>& h, uint8_t& m)
: AxisAlignedCubeGeometry<ctype,mydim,cdim>(FieldVector<ctype,cdim>(0),FieldVector<ctype,cdim>(0)) // anything
{
if (cdim!=mydim+1)
DUNE_THROW(GridError, "This YaspGeometry constructor assumes cdim=mydim+1");
FieldVector<ctype, cdim> lower = p;
FieldVector<ctype, cdim> upper = p;
lower.axpy(-0.5,h);
upper.axpy( 0.5,h);
lower[m] = upper[m] = p[m];
std::bitset<cdim> axes((1<<cdim)-1); // all bits set
axes[m] = false; // except the one at 'missing'
// set up base class
static_cast< AxisAlignedCubeGeometry<ctype,mydim,cdim> & >( *this ) = AxisAlignedCubeGeometry<ctype,mydim,cdim>(lower, upper, axes);
}
//! copy constructor
YaspGeometry (const YaspGeometry& other)
: AxisAlignedCubeGeometry<ctype,mydim,cdim>(other)
{}
//! print function
void print (std::ostream& s) const
{
s << "YaspGeometry<"<<mydim<<","<<cdim<< "> ";
s << "midpoint";
for (int i=0; i<cdim; i++)
s << " " << 0.5*(this->lower_[i] + this->upper_[i]);
s << " extension";
for (int i=0; i<cdim; i++)
s << " " << (this->upper_[i] - this->lower_[i]);
s << " coordinates: " << this->axes_;
}
};
//! specialize for dim=dimworld, i.e. a volume element
template<int mydim, class GridImp>
class YaspGeometry<mydim,mydim,GridImp> : public AxisAlignedCubeGeometry<typename GridImp::ctype,mydim,mydim>
{
public:
typedef typename GridImp::ctype ctype;
//! default constructor
YaspGeometry ()
: AxisAlignedCubeGeometry<ctype,mydim,mydim>(FieldVector<ctype,mydim>(0),FieldVector<ctype,mydim>(0)) // anything
{}
//! constructor from midpoint and extension
YaspGeometry (const FieldVector<ctype, mydim>& p, const FieldVector<ctype, mydim>& h)
: AxisAlignedCubeGeometry<ctype,mydim,mydim>(FieldVector<ctype,mydim>(0),FieldVector<ctype,mydim>(0)) // anything
{
FieldVector<ctype, mydim> lower = p;
FieldVector<ctype, mydim> upper = p;
lower.axpy(-0.5,h);
upper.axpy( 0.5,h);
// set up base class
static_cast< AxisAlignedCubeGeometry<ctype,mydim,mydim> & >( *this ) = AxisAlignedCubeGeometry<ctype,mydim,mydim>(lower, upper);
}
//! copy constructor (skipping temporary variables)
YaspGeometry (const YaspGeometry& other)
: AxisAlignedCubeGeometry<ctype,mydim,mydim>(other)
{}
//! print function
void print (std::ostream& s) const
{
s << "YaspGeometry<"<<mydim<<","<<mydim<< "> ";
s << "midpoint";
for (int i=0; i<mydim; i++)
s << " " << 0.5 * (this->lower_[i] + this->upper_[i]);
s << " extension";
for (int i=0; i<mydim; i++)
s << " " << (this->upper_[i] + this->lower_[i]);
}
};
//! specialization for dim=0, this is a vertex
template<int cdim, class GridImp>
class YaspGeometry<0,cdim,GridImp> : public AxisAlignedCubeGeometry<typename GridImp::ctype,0,cdim>
{
public:
typedef typename GridImp::ctype ctype;
//! default constructor
YaspGeometry ()
: AxisAlignedCubeGeometry<typename GridImp::ctype,0,cdim>(FieldVector<ctype,cdim>(0)) // anything
{}
//! constructor
explicit YaspGeometry ( const FieldVector< ctype, cdim > &p )
: AxisAlignedCubeGeometry<typename GridImp::ctype,0,cdim>( p )
{}
YaspGeometry ( const FieldVector< ctype, cdim > &p, const FieldVector< ctype, cdim > &, uint8_t &)
: AxisAlignedCubeGeometry<typename GridImp::ctype,0,cdim>( p )
{}
//! print function
void print (std::ostream& s) const
{
s << "YaspGeometry<"<<0<<","<<cdim<< "> ";
s << "position " << this->lower_;
}
};
// operator<< for all YaspGeometrys
template <int mydim, int cdim, class GridImp>
inline
std::ostream& operator<< (std::ostream& s, YaspGeometry<mydim,cdim,GridImp>& e)
{
e.print(s);
return s;
}
} // namespace Dune
#endif // DUNE_GRID_YASPGRIDGEOMETRY_HH
|