diff --git a/dune/gdt/operators/projections.hh b/dune/gdt/operators/projections.hh index 5f9a234dea3776191e9c6fb5b137a1caa29749fa..4f9894928dad45b9fedff7b429c871c01d62d366 100644 --- a/dune/gdt/operators/projections.hh +++ b/dune/gdt/operators/projections.hh @@ -180,8 +180,9 @@ private: static const unsigned int dimDomain = GridViewType::dimension; public: - L2Projection(const GridViewType& grid_view) + L2Projection(const GridViewType& grid_view, const size_t over_integrate = 0) : grid_view_(grid_view) + , over_integrate_(over_integrate) { } @@ -282,8 +283,8 @@ private: // create quadrature // guess the polynomial order of the source by hoping that they are the same for all entities const size_t integrand_order = std::max(local_source->order(), local_basis.order()) + local_basis.order(); - assert(integrand_order < std::numeric_limits<int>::max()); - const auto& quadrature = QuadratureRules<DomainFieldType, dimDomain>::rule(entity.type(), int(integrand_order)); + const auto& quadrature = QuadratureRules<DomainFieldType, dimDomain>::rule( + entity.type(), boost::numeric_cast<int>(integrand_order + over_integrate_)); // loop over all quadrature points for (const auto& quadrature_point : quadrature) { const auto local_point = quadrature_point.position(); @@ -333,9 +334,10 @@ private: const auto local_source = source.local_function(entity); const auto basis = range.space().base_function_set(entity); // do a volume quadrature - const size_t integrand_order = std::max(size_t(local_source->order() - 1), basis.order()) + basis.order(); - assert(integrand_order < std::numeric_limits<int>::max()); - const auto& quadrature = QuadratureRules<DomainFieldType, dimDomain>::rule(entity.type(), int(integrand_order)); + const size_t integrand_order = + std::max(std::max(ssize_t(local_source->order()) - 1, ssize_t(0)), ssize_t(basis.order())) + basis.order(); + const auto& quadrature = QuadratureRules<DomainFieldType, dimDomain>::rule( + entity.type(), boost::numeric_cast<int>(integrand_order + over_integrate_)); const auto quadrature_it_end = quadrature.end(); for (auto quadrature_it = quadrature.begin(); quadrature_it != quadrature_it_end; ++quadrature_it) { const auto xx = quadrature_it->position(); @@ -360,6 +362,7 @@ private: } // ... apply_global_l2_projection_(...) const GridViewType& grid_view_; + const size_t over_integrate_; }; // class L2Projection