Provided by: librheolef-dev_6.5-1build1_amd64 bug

NAME

       field_functor - a functor wrapper suitable for field expressions

DESCRIPTION

       A functor is a class-function, i.e. a class that defines the operator(). A variable f of a
       class-function can be used as f(arg) and when its argument is of type point see  point(2),
       the  function  f interprets as a continuous field field.  Thus, it can be interpolated see
       interpolate(4) and it can be combined within field expressions see field(2)  that  appears
       in arguments of see integrate(4).

EXAMPLE

           struct f : field_functor<f,Float> {
             Float operator() (const point& x) const { return 1-norm(x); }
           };
           // ...
           geo omega ("square");
           space Xh (omega, "P1");
           field fh = interpolate (Xh, f);
           test  (Xh);
           field lh = integrate (f*v);

IMPLEMENTATION NOTE

       The  current  implementation  of  a  field_functor  class bases on the curiously recurring
       template  pattern  (CRTP)  C++  idiom:  the  definition  of  the  class  f  derives   from
       field_functor<f,Float> that depend itself upon f.  So, be carrefull when using copy-paste,
       as there is no checks if you write e.g. field_functor<g,Float>  with  another  function  g
       instead of f.

IMPLEMENTATION

       template <class Function, class Result>
       struct field_functor
         : std::unary_function<point_basic<float_traits<Result> >,Result> {
        const Function& get_ref() const { return static_cast<const Function&>(*this); }
        operator Function() const { return get_ref(); }
        Result operator() (const point& x) const { return get_ref().operator()(x); }
       };
       #ifdef TODO
       // transforme a function or a functor into a field_functor, suitable for expressions mixing field and functions
       template <class F, class R>
       struct field_function_s : field_functor<field_function_s<F,R>, R> {
         typedef typename float_traits<R>::type float_type;
         R operator() (const point_basic<float_type>& x) const { return _f.operator()(x); }
         field_function_s(F f) : _f(f) {}
         F _f;
       };
       template <class F>
       field_function_s<function<F>, typename F::result_type>
       field_function (F f) {
         typedef typename F::result_type R;
         return field_function_s<function<F>,R>(function<F>(f));
       }
       #endif // TODO

SEE ALSO

       point(2), interpolate(4), field(2), integrate(4)