From 0d66c91051011997db76b5398ecc77ebaddd9265 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Thu, 9 Jan 2014 17:00:47 +0100 Subject: [PATCH] [Extend] Introduce geometry class --- src/mygeometry.hh | 15 ++++++++++++ src/mygrid.hh | 34 +++++++++++++++++++++++++++ src/one-body-sample.cc | 53 +++++++++++------------------------------- 3 files changed, 63 insertions(+), 39 deletions(-) create mode 100644 src/mygeometry.hh create mode 100644 src/mygrid.hh diff --git a/src/mygeometry.hh b/src/mygeometry.hh new file mode 100644 index 00000000..9f73081e --- /dev/null +++ b/src/mygeometry.hh @@ -0,0 +1,15 @@ +#ifndef MY_GEOMETRY_HH +#define MY_GEOMETRY_HH + +struct MyGeometry { + MyGeometry() {} + + Dune::FieldVector<double, 2> A = { 0, 0 }; + Dune::FieldVector<double, 2> B = { 5, 0 }; + Dune::FieldVector<double, 2> C = { 5, 1 }; + Dune::FieldVector<double, 2> D = { 0, 1 }; + + Dune::FieldVector<double, 2> zenith = { 0, 1 }; +}; + +#endif diff --git a/src/mygrid.hh b/src/mygrid.hh new file mode 100644 index 00000000..964c82dc --- /dev/null +++ b/src/mygrid.hh @@ -0,0 +1,34 @@ +#include <dune/grid/common/gridfactory.hh> + +#include <dune/fufem/boundarypatch.hh> + +#include "mygeometry.hh" + +template <class Grid> +std::shared_ptr<Grid> constructGrid(MyGeometry const &myGeometry) { + std::array<unsigned int, 2> elements = { { 5, 1 } }; + return Dune::StructuredGridFactory<Grid>::createSimplexGrid( + myGeometry.A, myGeometry.C, elements); +} + +template <class GridView, class MyGeometry> class MyFaces { +private: + bool isClose(double a, double b) { + return std::abs(a - b) < 1e-14; + }; + +public: + MyFaces(GridView const &gridView, MyGeometry const &myGeometry) + : lower(gridView), upper(gridView) { + lower.insertFacesByProperty([&](typename GridView::Intersection const &in) { + return isClose(myGeometry.A[1], in.geometry().center()[1]); + }); + + upper.insertFacesByProperty([&](typename GridView::Intersection const &in) { + return isClose(myGeometry.C[1], in.geometry().center()[1]); + }); + } + + BoundaryPatch<GridView> lower; + BoundaryPatch<GridView> upper; +}; diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc index ef903594..2f21840c 100644 --- a/src/one-body-sample.cc +++ b/src/one-body-sample.cc @@ -72,6 +72,8 @@ #include "enum_verbosity.cc" #include "enums.hh" #include "friction_writer.hh" +#include "mygeometry.hh" +#include "mygrid.hh" #include "solverfactory.hh" #include "state.hh" #include "timestepping.hh" @@ -93,6 +95,8 @@ int main(int argc, char *argv[]) { parset); Dune::ParameterTreeParser::readOptions(argc, argv, parset); + MyGeometry const myGeometry; + auto const youngModulus = parset.get<double>("body.youngModulus"); auto const poissonRatio = parset.get<double>("body.poissonRatio"); auto const shearViscosity = parset.get<double>("body.shearViscosity"); @@ -102,23 +106,7 @@ int main(int argc, char *argv[]) { // {{{ Set up grid using Grid = Dune::ALUGrid<dims, dims, Dune::simplex, Dune::nonconforming>; - - Dune::FieldVector<size_t, dims> lowerLeft(0); - Dune::FieldVector<size_t, dims> upperRight(1); - upperRight[0] = 5; - upperRight[1] = 1; - - std::shared_ptr<Grid> grid; - { - Dune::array<unsigned int, dims> elements; - for (size_t i = 0; i < dims; ++i) - elements[i] = upperRight[i]; // 1x1 elements - - grid = Dune::StructuredGridFactory<Grid>::createSimplexGrid( - lowerLeft, upperRight, elements); - } - Dune::FieldVector<double, dims> zenith(0); - zenith[1] = 1; + auto grid = constructGrid<Grid>(myGeometry); // FIXME auto const refinements = parset.get<size_t>("grid.refinements"); grid->globalRefine(refinements); @@ -128,28 +116,14 @@ int main(int argc, char *argv[]) { GridView const leafView = grid->leafView(); // }}} - // Set up faces - BoundaryPatch<GridView> lowerFace(leafView); - BoundaryPatch<GridView> upperFace(leafView); - { - auto const isClose = [](double a, - double b) { return std::abs(a - b) < 1e-14; }; - lowerFace.insertFacesByProperty([&]( - typename GridView::Intersection const &in) { - return isClose(lowerLeft[1], in.geometry().center()[1]); - }); - - upperFace.insertFacesByProperty([&]( - typename GridView::Intersection const &in) { - return isClose(upperRight[1], in.geometry().center()[1]); - }); - } + // Set up myFaces + MyFaces<GridView, MyGeometry> myFaces(leafView, myGeometry); // Neumann boundary BoundaryPatch<GridView> const neumannBoundary(leafView); // Frictional Boundary - BoundaryPatch<GridView> const &frictionalBoundary = lowerFace; + BoundaryPatch<GridView> const &frictionalBoundary = myFaces.lower; Dune::BitSetVector<1> frictionalNodes(fineVertexCount); frictionalBoundary.getVertices(frictionalNodes); @@ -157,10 +131,10 @@ int main(int argc, char *argv[]) { Dune::BitSetVector<dims> noNodes(fineVertexCount); Dune::BitSetVector<dims> dirichletNodes(fineVertexCount); for (size_t i = 0; i < fineVertexCount; ++i) { - if (lowerFace.containsVertex(i)) + if (myFaces.lower.containsVertex(i)) dirichletNodes[i][1] = true; - if (upperFace.containsVertex(i)) + if (myFaces.upper.containsVertex(i)) dirichletNodes[i] = true; } @@ -204,7 +178,8 @@ int main(int argc, char *argv[]) { // Assemble forces Vector gravityFunctional; - myAssembler.assembleBodyForce(gravity, density, zenith, gravityFunctional); + myAssembler.assembleBodyForce(gravity, density, myGeometry.zenith, + gravityFunctional); // Problem formulation: right-hand side auto const computeExternalForces = [&](double _relativeTime, Vector &_ell) { @@ -219,12 +194,12 @@ int main(int argc, char *argv[]) { { double volume = 1.0; for (size_t i = 0; i < dims; ++i) - volume *= (upperRight[i] - lowerLeft[i]); + volume *= (myGeometry.C[i] - myGeometry.A[i]); double area = 1.0; for (size_t i = 0; i < dims; ++i) if (i != 1) - area *= (upperRight[i] - lowerLeft[i]); + area *= (myGeometry.C[i] - myGeometry.A[i]); // volume * gravity * density / area = normal stress // V * g * rho / A = sigma_n -- GitLab