#include "config.h"

#include <dune/common/parallel/mpihelper.hh>
#include <dune/curvedsurfacegrid/curvedsurfacegrid.hh>
#include <dune/curvedsurfacegrid/gridfunctions/analyticdiscretefunction.hh>
#include <dune/grid/io/file/gmshreader.hh>

using namespace Dune;

#if HAVE_DUNE_FOAMGRID
  #include <dune/foamgrid/foamgrid.hh>
  using GridType = FoamGrid<2,3>;
#elif HAVE_DUNE_ALUGRID
  #include <dune/alugrid/grid.hh>
  using GridType = Dune::ALUGrid<2,3,Dune::simplex,Dune::conforming>;
#endif

int main(int argc, char** argv)
{
  MPIHelper::instance(argc, argv);

  // 1. Construct a reference grid
  auto refGrid = GmshReader<GridType>::read(DUNE_GRID_PATH "sphere.msh");

  // 2. Define the geometry mapping
  auto sphere = [](const auto& x) { return x / x.two_norm(); };
  auto sphereGF = analyticDiscreteFunction(sphere, *refGrid, /*order*/ 3);

  // 3. Wrap the reference grid to build a curved grid
  CurvedSurfaceGrid grid{*refGrid, sphereGF};
}