[dune-fem] LocalFunctionAdapter
Agnese, Marco
m.agnese13 at imperial.ac.uk
Thu Jun 4 19:41:25 CEST 2015
Hi,
I am trying (without much success :)) to interpolate a c++ analytical function over a grid.
So let's suppose that I have an identical function
RangeType f(const DomainType& x,const double& t,const EntityType& entity)
{
return x;
}
I have created the following class
template<typename DiscreteSpaceImp>
class LocalAnalyticalFunction
{
public:
typedef DiscreteSpaceImp DiscreteFunctionSpaceType;
typedef typename DiscreteFunctionSpaceType::FunctionSpaceType FunctionSpaceType;
typedef typename DiscreteFunctionSpaceType::GridPartType GridPartType;
typedef typename DiscreteFunctionSpaceType::EntityType EntityType;
typedef typename FunctionSpaceType::DomainType DomainType;
typedef typename FunctionSpaceType::RangeType RangeType;
typedef std::function<RangeType(const DomainType&,const double&,const EntityType&)> AnalyticalFunctionType;
// constructor
LocalAnalyticalFunction(const AnalyticalFunctionType& f,const double& t):
f_(f),t_(t)
{}
// evaluate local function
inline void evaluate(const DomainType& x,RangeType& val)
{
val=f_(entity().geometry().global(x),t_,entity());
}
// initialize to new entity
inline void init(const EntityType& entity)
{
entity_=&entity;
}
inline const EntityType& entity() const
{
return *entity_;
}
private:
EntityType const * entity_;
const AnalyticalFunctionType& f_;
const double& t_;
};
Now I try to interpolate f() doing this
typedef LocalAnalyticalFunction<DiscreteSpaceType> LocalAnalyticalFunctionType;
LocalAnalyticalFunctionType localAnalyticalFunction(f,t);
// create adapter
typedef LocalFunctionAdapter<LocalAnalyticalFunctionType> AdaptedFunctionType;
AdaptedFunctionType fAdapted("adapted function",localAnalyticalFunction,df.gridPart());
interpolate(fAdapted,df);
where df is a discrete function defined over a LagrangeSpace.
The interpolate() function returns me the following error
no known conversion for argument 1 from ‘const Dune::Fem::QuadraturePointWrapper<Dune::Fem::CachingPointList<Dune::Fem::LeafGridPart<Dune::GeometryGrid<Dune::AlbertaGrid<2, 2>, Dune::Fem::VertexFunction<Dune::AlbertaGrid<2, 2> >, std::allocator<void> > >, 0, Dune::Fem::LagrangePointSetTraits<double, 2, 2u> > >’ to ‘const DomainType& {aka const Dune::FieldVector<double, 2>&}
therefore seems that it calls the evaluate() using a lagrange point as x which has a type different from DomainType.
What I am doing wrong? I don't understand.
Thank you very much for your help,
cheers,
Marco.
More information about the dune-fem
mailing list