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