diff --git a/src/harmonicmaps.cc b/src/harmonicmaps.cc index 4b35c648f03ddf5dac444f9220f0b622bb6ac606..0632cc3a7ca970d4a5cf465d682b71e4173005c6 100644 --- a/src/harmonicmaps.cc +++ b/src/harmonicmaps.cc @@ -21,6 +21,7 @@ #include <dune/functions/gridfunctions/discretescalarglobalbasisfunction.hh> #include <dune/functions/functionspacebases/pq1nodalbasis.hh> #include <dune/functions/functionspacebases/pqknodalbasis.hh> +#include <dune/functions/functionspacebases/bsplinebasis.hh> #include <dune/fufem/boundarypatch.hh> #include <dune/fufem/functiontools/basisinterpolator.hh> @@ -41,6 +42,7 @@ #include <dune/gfe/geodesicfeassembler.hh> #include <dune/gfe/riemanniantrsolver.hh> #include <dune/gfe/embeddedglobalgfefunction.hh> +#include <dune/gfe/bsplineinterpolate.hh> // grid dimension const int dim = 2; @@ -56,6 +58,8 @@ typedef UnitVector<double,3> TargetSpace; // Tangent vector of the image space const int blocksize = TargetSpace::TangentVector::dimension; +//#define LAGRANGE + using namespace Dune; @@ -85,8 +89,10 @@ int main (int argc, char *argv[]) try ParameterTreeParser::readOptions(argc, argv, parameterSet); - // read solver settings + // read problem settings const int numLevels = parameterSet.get<int>("numLevels"); + const int order = parameterSet.get<int>("order"); + // read solver settings const double tolerance = parameterSet.get<double>("tolerance"); const int maxTrustRegionSteps = parameterSet.get<int>("maxTrustRegionSteps"); const double initialTrustRegionRadius = parameterSet.get<double>("initialTrustRegionRadius"); @@ -106,13 +112,14 @@ int main (int argc, char *argv[]) try shared_ptr<GridType> grid; FieldVector<double,dim> lower(0), upper(1); + array<unsigned int,dim> elements; if (parameterSet.get<bool>("structuredGrid")) { lower = parameterSet.get<FieldVector<double,dim> >("lower"); upper = parameterSet.get<FieldVector<double,dim> >("upper"); - array<unsigned int,dim> elements = parameterSet.get<array<unsigned int,dim> >("elements"); + elements = parameterSet.get<array<unsigned int,dim> >("elements"); grid = StructuredGridFactory<GridType>::createCubeGrid(lower, upper, elements); } else { @@ -128,11 +135,15 @@ int main (int argc, char *argv[]) try ////////////////////////////////////////////////////////////////////////////////// // Construct the scalar function space basis corresponding to the GFE space ////////////////////////////////////////////////////////////////////////////////// - - typedef Dune::Functions::PQKNodalBasis<typename GridType::LeafGridView, 3> FEBasis; - +#ifdef LAGRANGE + typedef Dune::Functions::PQKNodalBasis<typename GridType::LeafGridView, 1> FEBasis; FEBasis feBasis(grid->leafGridView()); - +#else + typedef Dune::Functions::BSplineBasis<typename GridType::LeafGridView> FEBasis; + for (auto& i : elements) + i = i<<(numLevels-1); + FEBasis feBasis(grid->leafGridView(), lower, upper, elements, order); +#endif typedef DuneFunctionsBasis<FEBasis> FufemFEBasis; FufemFEBasis fufemFeBasis(feBasis); @@ -160,7 +171,11 @@ int main (int argc, char *argv[]) try auto pythonInitialIterate = module.get("fdf").toC<std::shared_ptr<FBase>>(); std::vector<TargetSpace::CoordinateType> v; +#ifdef LAGRANGE ::Functions::interpolate(fufemFeBasis, v, *pythonInitialIterate); +#else + Dune::Functions::interpolate(feBasis, v, *pythonInitialIterate, lower, upper, elements, order); +#endif for (size_t i=0; i<x.size(); i++) x[i] = v[i];