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