From 216dbb4f19e5100f1a35f462cc806c43783ac485 Mon Sep 17 00:00:00 2001 From: Oliver Sander <oliver.sander@tu-dresden.de> Date: Tue, 22 Mar 2016 14:13:22 +0100 Subject: [PATCH] Allow to start from functions given on other grids and function spaces This is planned to be used to start a fine-grid computation on the coarse-grid solution, or to start a high-order computation from a low-order one. This is helpful, in particular, for measurements of the discretization error, which take a lot of time. --- src/cosserat-continuum.cc | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/cosserat-continuum.cc b/src/cosserat-continuum.cc index 086c8e2f..95c87570 100644 --- a/src/cosserat-continuum.cc +++ b/src/cosserat-continuum.cc @@ -44,6 +44,7 @@ #include <dune/gfe/geodesicfeassembler.hh> #include <dune/gfe/riemanniantrsolver.hh> #include <dune/gfe/vertexnormals.hh> +#include <dune/gfe/embeddedglobalgfefunction.hh> // grid dimension const int dim = 2; @@ -252,7 +253,34 @@ int main (int argc, char *argv[]) try if (parameterSet.hasKey("startFromFile")) { - GFE::CosseratVTKReader::read(x, parameterSet.get<std::string>("initialIterateFilename")); + std::shared_ptr<GridType> initialIterateGrid; + if (parameterSet.get<bool>("structuredGrid")) + { + std::array<unsigned int,dim> elements = parameterSet.get<array<unsigned int,dim> >("elements"); + initialIterateGrid = StructuredGridFactory<GridType>::createCubeGrid(lower, upper, elements); + } + else + { + std::string path = parameterSet.get<std::string>("path"); + std::string initialIterateGridFilename = parameterSet.get<std::string>("initialIterateGridFilename"); + + initialIterateGrid = std::shared_ptr<GridType>(GmshReader<GridType>::read(path + "/" + initialIterateGridFilename)); + } + + SolutionType initialIterate; + GFE::CosseratVTKReader::read(initialIterate, parameterSet.get<std::string>("initialIterateFilename")); + + typedef Dune::Functions::PQkNodalBasis<typename GridType::LeafGridView, 2> InitialBasis; + InitialBasis initialBasis(initialIterateGrid->leafGridView()); + + GFE::EmbeddedGlobalGFEFunction<InitialBasis,TargetSpace> initialFunction(initialBasis,initialIterate); + + std::vector<FieldVector<double,7> > v; + Dune::Functions::interpolate(feBasis,v,initialFunction); + + for (size_t i=0; i<x.size(); i++) + x[i] = TargetSpace(v[i]); + } else { lambda = std::string("lambda x: (") + parameterSet.get<std::string>("initialDeformation") + std::string(")"); PythonFunction<FieldVector<double,dimworld>, FieldVector<double,3> > pythonInitialDeformation(Python::evaluate(lambda)); -- GitLab