1 #include <config.h>
2
3 #include <iostream>
4 #include <cmath>
5
6 #include "../../test/testgrid.hh"
7 #include "../../test/exactsolution.hh"
8
9 #include <dune/fem/function/adaptivefunction.hh>
10 #include <dune/fem/function/common/localfunctionadapter.hh>
11 #include <dune/fem/function/common/gridfunctionadapter.hh>
12 #include <dune/fem/gridpart/adaptiveleafgridpart.hh>
13 #include <dune/fem/misc/mpimanager.hh>
14 #include <dune/fem/space/common/adaptationmanager.hh>
15 #include <dune/fem/space/common/functionspace.hh>
16 #include <dune/fem/space/common/interpolate.hh>
17 #include <dune/fem/space/discontinuousgalerkin.hh>
18 #include <dune/fem/space/common/interpolate.hh>
19
main(int argc,char ** argv)20 int main ( int argc, char **argv )
21 {
22 //initialize MPI
23 Dune::Fem::MPIManager::initialize( argc, argv );
24
25 // create grid
26 typedef Dune::GridSelector::GridType GridType;
27 GridType &grid = Dune::Fem::TestGrid::grid();
28
29 // create grid part
30 typedef Dune::Fem::AdaptiveLeafGridPart< GridType > GridPartType;
31 GridPartType gridPart( grid );
32
33 // function space type
34 typedef typename GridPartType::ctype DomainFieldType;
35 constexpr int dimDomain = GridPartType::dimensionworld;
36 constexpr int dimRange = DIMRANGE;
37 constexpr int polOrder = POLORDER;
38 typedef Dune::Fem::FunctionSpace< DomainFieldType, double, dimDomain, dimRange > FunctionSpaceType;
39 typedef typename FunctionSpaceType::DomainType DomainType;
40 typedef typename FunctionSpaceType::RangeType RangeType;
41
42 // create discrete function space
43 typedef Dune::Fem::DiscontinuousGalerkinSpace< FunctionSpaceType, GridPartType, polOrder > DiscreteFunctionSpaceType;
44 DiscreteFunctionSpaceType discreteFunctionSpace( gridPart );
45 typedef typename DiscreteFunctionSpaceType::EntityType EntityType;
46
47 // create discrete functions
48 typedef Dune::Fem::AdaptiveDiscreteFunction< DiscreteFunctionSpaceType > DiscreteFunctionType;
49 DiscreteFunctionType dfLocalAdapted( "df local adapted", discreteFunctionSpace );
50 dfLocalAdapted.clear();
51 DiscreteFunctionType dfGridAdapted( "df grid adapted", discreteFunctionSpace );
52 dfGridAdapted.clear();
53
54 // create local function adapter
55 typedef Dune::Fem::LocalAnalyticalFunctionBinder<DiscreteFunctionSpaceType> LocalAnalyticalFunctionType;
56 LocalAnalyticalFunctionType localAnalyticalFunction(
57 [&](const DomainType &x,double t,const EntityType& entity)
58 {
59 RangeType ret(1);
60 for(int r = 0; r < RangeType :: dimension; ++r )
61 for( int i = 0; i < DomainType :: dimension; ++i )
62 ret[ r ] += pow(sin( M_PI * x[ i ] ),double(r+1));
63 #if defined USE_COMPLEX
64 ret*= std::complex<double>( 1 , -2. );
65 #endif
66 return ret;
67 });
68 typedef Dune::Fem::LocalFunctionAdapter<LocalAnalyticalFunctionType> LocalAdaptedFunctionType;
69 LocalAdaptedFunctionType localAdapted("local adapted function",std::move(localAnalyticalFunction),gridPart,5);
70
71 // interpolate local adpated function over discrete function
72 Dune::Fem::interpolate(localAdapted,dfLocalAdapted);
73
74 // create grid function adapter
75 typedef Dune::Fem::ExactSolution< FunctionSpaceType > GridAnalyticalFunctionType;
76 GridAnalyticalFunctionType gridAnalyticalFunction;
77 typedef Dune::Fem::GridFunctionAdapter< GridAnalyticalFunctionType, GridPartType > GridAdaptedFunctionType;
78 GridAdaptedFunctionType gridAdapted( "grid adapted function", gridAnalyticalFunction, gridPart, 5 );
79
80 // interpolate grid adpated function over discrete function
81 Dune::Fem::interpolate( gridAdapted, dfGridAdapted );
82
83 // compare the 2 adapted functions
84 bool areDifferent(false);
85 auto it(dfGridAdapted.dbegin());
86 for(const auto& dof:dofs(dfLocalAdapted))
87 {
88 if(std::abs(dof-*it)>1.e-12)
89 areDifferent=true;
90 ++it;
91 }
92 if(areDifferent)
93 std::cout<<"ERROR: the 2 adapted functions are different!"<<std::endl;
94 else
95 std::cout<<"The 2 adapted functions are equal!"<<std::endl;
96
97 return 0;
98 }
99