#ifndef SRC_SAND_WEDGE_DATA_PATCHFUNCTION_HH #define SRC_SAND_WEDGE_DATA_PATCHFUNCTION_HH #include <dune/common/function.hh> #include <dune/common/fvector.hh> #include <dune/common/parametertree.hh> class PatchFunction : public Dune::VirtualFunction<Dune::FieldVector<double, DIM>, Dune::FieldVector<double, 1>> { private: bool static isBetween(double x, double lower, double upper) { return lower <= x and x <= upper; } bool static isClose(double a, double b) { return std::abs(a - b) < 1e-14; }; bool insideRegion2(Dune::FieldVector<double, DIM> const &z) const { assert(isClose(0, z[1])); return isBetween(z[0], _X[0], _Y[0]); } Dune::FieldVector<double, DIM> const &_X; Dune::FieldVector<double, DIM> const &_Y; double const _v1; double const _v2; public: PatchFunction(double v1, double v2) : _X(MyGeometry::X), _Y(MyGeometry::Y), _v1(v1), _v2(v2) {} void evaluate(Dune::FieldVector<double, DIM> const &x, Dune::FieldVector<double, 1> &y) const { y = insideRegion2(x) ? _v2 : _v1; } }; #endif