From 1a99f2ceda091a2d74fad227be9f6adee5fb35af Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Mon, 4 May 2015 06:10:30 +0200 Subject: [PATCH] Use the BSplineBasis Unfortunately, this bases needs to be switched on and off using preprocessor commands. Hopefully I'll find a way to make that prettier in the future. --- src/harmonicmaps.cc | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/harmonicmaps.cc b/src/harmonicmaps.cc index 4b35c648..0632cc3a 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]; -- GitLab