From b23b36a46ea2188ac9cdbed0f061aa72b9731323 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Sun, 1 May 2011 06:46:04 +0000
Subject: [PATCH] add support for unstructured grids

[[Imported from SVN: r7226]]
---
 harmonicmaps-eoc.cc | 59 +++++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 32 deletions(-)

diff --git a/harmonicmaps-eoc.cc b/harmonicmaps-eoc.cc
index 63c2c884..a217d136 100644
--- a/harmonicmaps-eoc.cc
+++ b/harmonicmaps-eoc.cc
@@ -10,6 +10,7 @@
 #include <dune/grid/onedgrid.hh>
 #include <dune/grid/utility/structuredgridfactory.hh>
 #include <dune/grid/io/file/amirameshwriter.hh>
+#include <dune/grid/io/file/amirameshreader.hh>
 
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 #include <dune/fufem/assemblers/operatorassembler.hh>
@@ -26,7 +27,7 @@
 #include <dune/gfe/geodesicfefunctionadaptor.hh>
 
 // grid dimension
-const int dim = 2;
+const int dim = 3;
 
 typedef UnitVector<3> TargetSpace;
 typedef std::vector<TargetSpace> SolutionType;
@@ -156,15 +157,11 @@ int main (int argc, char *argv[]) try
     const int baseIterations      = parameterSet.get<int>("baseIt");
     const double baseTolerance    = parameterSet.get<double>("baseTolerance");
 
+    // only if a structured grid is used
     const int numBaseElements = parameterSet.get<int>("numBaseElements");
+    FieldVector<double,dim> lowerLeft  = parameterSet.get<FieldVector<double,dim> >("lowerLeft");
+    FieldVector<double,dim> upperRight = parameterSet.get<FieldVector<double,dim> >("upperRight");
     
-    // /////////////////////////////////////////
-    //   Read Dirichlet values
-    // /////////////////////////////////////////
-
-    
-
-
     // ///////////////////////////////////////////////////////////
     //   First compute the 'exact' solution on a very fine grid
     // ///////////////////////////////////////////////////////////
@@ -172,14 +169,18 @@ int main (int argc, char *argv[]) try
     typedef std::conditional<dim==1,OneDGrid,UGGrid<dim> >::type GridType;
 
     //    Create the reference grid
-
-    array<unsigned int,dim> elements;
-    elements.fill(numBaseElements);
-    FieldVector<double,dim> lowerLeft  = parameterSet.get<FieldVector<double,dim> >("lowerLeft");
-    FieldVector<double,dim> upperRight = parameterSet.get<FieldVector<double,dim> >("upperRight");
-    shared_ptr<GridType> referenceGrid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft,
-                                                                                            upperRight,
-                                                                                            elements);
+    shared_ptr<GridType> referenceGrid;
+    
+    if (parameterSet.get<std::string>("gridType")=="structured") {
+        array<unsigned int,dim> elements;
+        elements.fill(numBaseElements);
+        referenceGrid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft,
+                                                                           upperRight,
+                                                                           elements);
+    } else {
+        referenceGrid = shared_ptr<GridType>(AmiraMeshReader<GridType>::read(parameterSet.get<std::string>("gridFile")));
+    }
+    
     referenceGrid->globalRefine(numLevels-1);
 
     //  Solve the rod Dirichlet problem
@@ -209,11 +210,16 @@ int main (int argc, char *argv[]) try
     
     for (int i=1; i<=numLevels; i++) {
 
-        array<unsigned int,dim> elements;
-        elements.fill(numBaseElements);
-        shared_ptr<GridType> grid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft,
-                                                                                       upperRight,
-                                                                                       elements);
+        shared_ptr<GridType> grid;
+        if (parameterSet.get<std::string>("gridType")=="structured") {
+            array<unsigned int,dim> elements;
+            elements.fill(numBaseElements);
+            grid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft,
+                                                                      upperRight,
+                                                                      elements);
+        } else {
+            grid = shared_ptr<GridType>(AmiraMeshReader<GridType>::read(parameterSet.get<std::string>("gridFile")));
+        }
 
         grid->globalRefine(i-1);
 
@@ -238,17 +244,6 @@ int main (int argc, char *argv[]) try
         for (int j=i; j<numLevels; j++)
             geodesicFEFunctionAdaptor(*grid, solution);
 
-        //assert(referenceSolution.size() == solution.size());
-#if 0
-        xEmbedded.resize(solution.size());
-        for (int j=0; j<solution.size(); j++)
-            xEmbedded[j] = solution[j].globalCoordinates();
-
-        LeafAmiraMeshWriter<GridType> amirameshRefined;
-        amirameshRefined.addGrid(grid->leafView());
-        amirameshRefined.addVertexData(xEmbedded, grid->leafView());
-        amirameshRefined.write("harmonic_result_" + numberAsAscii.str() + "_refined.am");
-#endif
         // Interpret TargetSpace as isometrically embedded into an R^m, because this is
         // how the corresponding Sobolev spaces are defined.
 
-- 
GitLab