AMDiS 2.11-git
The Adaptive Multi-Dimensional Simulation Toolbox
 
Loading...
Searching...
No Matches
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
11namespace 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 (localFctOrder >= 0)
33 return localFctOrder;
34 else if constexpr(Concepts::Polynomial<LF>)
35 return order(lf);
36 else
37 return localFctOrder;
38 };
39
40 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()`.");
41
42 using Range = typename decltype(localFct)::Range;
43 Range result(0);
44
45 using Rules = Dune::QuadratureRules<typename GV::ctype, GV::dimension>;
46 for (auto const& element : elements(gridView, Dune::Partitions::interior)) {
47 auto geometry = element.geometry();
48
49 localFct.bind(element);
50 auto const& quad = Rules::rule(element.type(), quadOrder(localFct));
51
52 for (auto const qp : quad)
53 result += localFct(qp.position()) * geometry.integrationElement(qp.position()) * qp.weight();
54 localFct.unbind();
55 }
56
57 return gridView.comm().sum(result);
58 }
59
60} // end namespace AMDiS
decltype(auto) makeGridFunction(PreGridFct const &preGridFct, GridView const &gridView)
Generator for Gridfunctions from Expressions (PreGridfunctions)
Definition GridFunction.hpp:194