AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
Integrate.hpp
1 #pragma once
2 
3 #include <type_traits>
4 #include <dune/geometry/quadraturerules.hh>
5 #include <dune/grid/common/partitionset.hh>
6 
7 #include <amdis/GridFunctions.hpp>
8 #include <amdis/Output.hpp>
9 #include <amdis/common/Order.hpp>
10 
11 namespace AMDiS
12 {
15 
24  template <class Expr, class GV>
25  auto integrate(Expr&& expr, GV const& gridView, int localFctOrder = -1)
26  {
27  auto gridFct = makeGridFunction(FWD(expr), gridView);
28  auto localFct = localFunction(gridFct);
29 
30  using LF = TYPEOF(localFct);
31  auto quadOrder = [localFctOrder](auto const& lf) {
32  if constexpr(Concepts::Polynomial<LF>)
33  return order(lf);
34  else
35  return localFctOrder;
36  };
37 
38  test_exit(Concepts::Polynomial<LF> || localFctOrder >= 0, "Polynomial degree of expression can not be deduced. You need to provide an explicit value for the quadrature degree or a quadrature rule in `integrate()`.");
39 
40  using Range = typename decltype(localFct)::Range;
41  Range result(0);
42 
43  using Rules = Dune::QuadratureRules<typename GV::ctype, GV::dimension>;
44  for (auto const& element : elements(gridView, Dune::Partitions::interior)) {
45  auto geometry = element.geometry();
46 
47  localFct.bind(element);
48  auto const& quad = Rules::rule(element.type(), quadOrder(localFct));
49 
50  for (auto const qp : quad)
51  result += localFct(qp.position()) * geometry.integrationElement(qp.position()) * qp.weight();
52  localFct.unbind();
53  }
54 
55  return gridView.comm().sum(result);
56  }
57 
58 } // end namespace AMDiS
decltype(auto) makeGridFunction(PreGridFct const &preGridFct, GridView const &gridView)
Generator for Gridfunctions from Expressions (PreGridfunctions)
Definition: GridFunction.hpp:168
Definition: AdaptBase.hpp:6