/usr/include/dune/pdelab/function/selectcomponent.hh is in libdune-pdelab-dev 2.0.0-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 | // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=8 sw=2 sts=2:
#ifndef DUNE_PDELAB_FUNCTION_SELECTCOMPONENT_HH
#define DUNE_PDELAB_FUNCTION_SELECTCOMPONENT_HH
#include <algorithm>
#include <cstddef>
#include <vector>
#include <dune/common/exceptions.hh>
#include <dune/pdelab/common/function.hh>
namespace Dune {
namespace PDELab {
//! Select certain component(s) of a gridfunction
/**
* \tparam GF Type for the GridFunction
* \tparam dimR Number of components of the resulting GridFunction
*
* \sa SelectComponentAdaptor, BoundaryGridFunctionSelectComponentAdaptor.
*/
template<typename GF, std::size_t dimR = 1>
class SelectComponentGridFunctionAdapter
: public GridFunctionBase<
GridFunctionTraits<
typename GF::Traits::GridViewType,
typename GF::Traits::RangeFieldType, dimR,
FieldVector<typename GF::Traits::RangeFieldType, dimR>
>,
SelectComponentGridFunctionAdapter<GF, dimR>
>
{
public:
typedef GridFunctionTraits<
typename GF::Traits::GridViewType,
typename GF::Traits::RangeFieldType, dimR,
FieldVector<typename GF::Traits::RangeFieldType, dimR>
> Traits;
private:
typedef GridFunctionBase<
Traits, SelectComponentGridFunctionAdapter
> Base;
GF& gf;
std::size_t remap[dimR];
void checkRemap() const {
for(std::size_t c = 0; c < dimR; ++c)
if(remap[c] >= GF::Traits::dimRange)
DUNE_THROW(InvalidStateException, "remap[" << c << "] = "
<< remap[c] << " >= GF::Traits::dimRange = "
<< GF::Traits::dimRange);
}
public:
//! construct with a consecutive range of indices
SelectComponentGridFunctionAdapter(GF& gf_, std::size_t first) :
gf(gf_)
{
for(std::size_t c = 0; c < dimR; ++c)
remap[c] = first+c;
checkRemap();
}
//! construct with a full index map
SelectComponentGridFunctionAdapter
( GF& gf_, const std::vector<std::size_t> remap_) :
gf(gf_)
{
if(remap_.size() != dimR)
DUNE_THROW(Exception, "Got an index map of size "
<< remap_.size() << " but size " << dimR << " was "
"expected.");
std::copy(remap_.begin(), remap_.end(), remap);
checkRemap();
}
void evaluate(const typename Traits::ElementType &e,
const typename Traits::DomainType &x,
typename Traits::RangeType &y) const
{
typename GF::Traits::RangeType y_;
gf.evaluate(e,x,y_);
for(std::size_t c = 0; c < dimR; ++c)
y[c] = y_[remap[c]];
}
const typename Traits::GridViewType& getGridView() const
{ return gf.getGridView(); }
template<typename Time>
void setTime(Time time) { gf.setTime(time); }
};
} // namspace PDELab
} // namspace Dune
#endif // DUNE_PDELAB_FUNCTION_SELECTCOMPONENT_HH
|