Skip to content
Snippets Groups Projects
Commit b23b36a4 authored by Oliver Sander's avatar Oliver Sander Committed by sander@FU-BERLIN.DE
Browse files

add support for unstructured grids

[[Imported from SVN: r7226]]
parent 13534837
No related branches found
No related tags found
No related merge requests found
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <dune/grid/onedgrid.hh> #include <dune/grid/onedgrid.hh>
#include <dune/grid/utility/structuredgridfactory.hh> #include <dune/grid/utility/structuredgridfactory.hh>
#include <dune/grid/io/file/amirameshwriter.hh> #include <dune/grid/io/file/amirameshwriter.hh>
#include <dune/grid/io/file/amirameshreader.hh>
#include <dune/fufem/functionspacebases/p1nodalbasis.hh> #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
#include <dune/fufem/assemblers/operatorassembler.hh> #include <dune/fufem/assemblers/operatorassembler.hh>
...@@ -26,7 +27,7 @@ ...@@ -26,7 +27,7 @@
#include <dune/gfe/geodesicfefunctionadaptor.hh> #include <dune/gfe/geodesicfefunctionadaptor.hh>
// grid dimension // grid dimension
const int dim = 2; const int dim = 3;
typedef UnitVector<3> TargetSpace; typedef UnitVector<3> TargetSpace;
typedef std::vector<TargetSpace> SolutionType; typedef std::vector<TargetSpace> SolutionType;
...@@ -156,15 +157,11 @@ int main (int argc, char *argv[]) try ...@@ -156,15 +157,11 @@ int main (int argc, char *argv[]) try
const int baseIterations = parameterSet.get<int>("baseIt"); const int baseIterations = parameterSet.get<int>("baseIt");
const double baseTolerance = parameterSet.get<double>("baseTolerance"); const double baseTolerance = parameterSet.get<double>("baseTolerance");
// only if a structured grid is used
const int numBaseElements = parameterSet.get<int>("numBaseElements"); 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 // First compute the 'exact' solution on a very fine grid
// /////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////
...@@ -172,14 +169,18 @@ int main (int argc, char *argv[]) try ...@@ -172,14 +169,18 @@ int main (int argc, char *argv[]) try
typedef std::conditional<dim==1,OneDGrid,UGGrid<dim> >::type GridType; typedef std::conditional<dim==1,OneDGrid,UGGrid<dim> >::type GridType;
// Create the reference grid // Create the reference grid
shared_ptr<GridType> referenceGrid;
array<unsigned int,dim> elements;
elements.fill(numBaseElements); if (parameterSet.get<std::string>("gridType")=="structured") {
FieldVector<double,dim> lowerLeft = parameterSet.get<FieldVector<double,dim> >("lowerLeft"); array<unsigned int,dim> elements;
FieldVector<double,dim> upperRight = parameterSet.get<FieldVector<double,dim> >("upperRight"); elements.fill(numBaseElements);
shared_ptr<GridType> referenceGrid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft, referenceGrid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft,
upperRight, upperRight,
elements); elements);
} else {
referenceGrid = shared_ptr<GridType>(AmiraMeshReader<GridType>::read(parameterSet.get<std::string>("gridFile")));
}
referenceGrid->globalRefine(numLevels-1); referenceGrid->globalRefine(numLevels-1);
// Solve the rod Dirichlet problem // Solve the rod Dirichlet problem
...@@ -209,11 +210,16 @@ int main (int argc, char *argv[]) try ...@@ -209,11 +210,16 @@ int main (int argc, char *argv[]) try
for (int i=1; i<=numLevels; i++) { for (int i=1; i<=numLevels; i++) {
array<unsigned int,dim> elements; shared_ptr<GridType> grid;
elements.fill(numBaseElements); if (parameterSet.get<std::string>("gridType")=="structured") {
shared_ptr<GridType> grid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft, array<unsigned int,dim> elements;
upperRight, elements.fill(numBaseElements);
elements); grid = StructuredGridFactory<GridType>::createSimplexGrid(lowerLeft,
upperRight,
elements);
} else {
grid = shared_ptr<GridType>(AmiraMeshReader<GridType>::read(parameterSet.get<std::string>("gridFile")));
}
grid->globalRefine(i-1); grid->globalRefine(i-1);
...@@ -238,17 +244,6 @@ int main (int argc, char *argv[]) try ...@@ -238,17 +244,6 @@ int main (int argc, char *argv[]) try
for (int j=i; j<numLevels; j++) for (int j=i; j<numLevels; j++)
geodesicFEFunctionAdaptor(*grid, solution); 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 // Interpret TargetSpace as isometrically embedded into an R^m, because this is
// how the corresponding Sobolev spaces are defined. // how the corresponding Sobolev spaces are defined.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment