From d0deb52798fbe23e77019eca54cf83d6fc7d24a3 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Tue, 17 Jun 2014 14:14:02 +0200 Subject: [PATCH] [Extend] Add 3D sand wedge problem --- .gitignore | 2 +- src/Makefile.am | 10 +++-- src/sand-wedge-data/mygeometry.hh | 2 + src/sand-wedge-data/mygrid.cc | 61 +++++++++++++++++++++++++++++-- src/sand-wedge-data/mygrid.hh | 6 +++ src/sand-wedge.cc | 5 +++ 6 files changed, 78 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index f47390d2..10191e28 100644 --- a/.gitignore +++ b/.gitignore @@ -26,5 +26,5 @@ /test-driver Makefile Makefile.in -src/sand-wedge +src/sand-wedge-?D src/sliding-block-?D diff --git a/src/Makefile.am b/src/Makefile.am index a939e404..45d92485 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = sand-wedge +bin_PROGRAMS = sand-wedge-2D sand-wedge-3D common_sources = \ assemblers.cc \ @@ -8,10 +8,14 @@ common_sources = \ timestepping.cc \ vtk.cc -sand_wedge_SOURCES = $(common_sources) sand-wedge.cc -sand_wedge_CPPFLAGS = \ +sand_wedge_2D_SOURCES = $(common_sources) sand-wedge.cc +sand_wedge_2D_CPPFLAGS = \ $(AM_CPPFLAGS) $(BOOST_CPPFLAGS) \ -Ddatadir=\"$(abs_srcdir)/sand-wedge-data/\" -DDIM=2 +sand_wedge_3D_SOURCES = $(common_sources) sand-wedge.cc +sand_wedge_3D_CPPFLAGS = \ + $(AM_CPPFLAGS) $(BOOST_CPPFLAGS) \ + -Ddatadir=\"$(abs_srcdir)/sand-wedge-data/\" -DDIM=3 # Some are for clang, others are for gcc AM_CXXFLAGS = \ diff --git a/src/sand-wedge-data/mygeometry.hh b/src/sand-wedge-data/mygeometry.hh index bf3baac5..468175d7 100644 --- a/src/sand-wedge-data/mygeometry.hh +++ b/src/sand-wedge-data/mygeometry.hh @@ -92,6 +92,8 @@ namespace { } } +double const depth = 0.10; + LocalVector const A = rotate(reference::A); LocalVector const B = rotate(reference::B); LocalVector const C = rotate(reference::C); diff --git a/src/sand-wedge-data/mygrid.cc b/src/sand-wedge-data/mygrid.cc index ec234395..2ef4059b 100644 --- a/src/sand-wedge-data/mygrid.cc +++ b/src/sand-wedge-data/mygrid.cc @@ -7,17 +7,46 @@ template <class Grid> std::shared_ptr<Grid> constructGrid() { Dune::GridFactory<Grid> gridFactory; +#if DIM == 3 + Dune::FieldMatrix<double, 6, DIM> vertices; +#else Dune::FieldMatrix<double, 3, DIM> vertices; - vertices[0] = MyGeometry::A; - vertices[1] = MyGeometry::B; - vertices[2] = MyGeometry::C; +#endif + for (size_t i = 0; i < 2; ++i) { + vertices[0][i] = MyGeometry::A[i]; + vertices[1][i] = MyGeometry::B[i]; + vertices[2][i] = MyGeometry::C[i]; +#if DIM == 3 + vertices[3][i] = MyGeometry::A[i]; + vertices[4][i] = MyGeometry::B[i]; + vertices[5][i] = MyGeometry::C[i]; +#endif + } + +#if DIM == 3 + for (size_t k = 0; k < 3; ++k) { + vertices[k][2] = -MyGeometry::depth / 2.0; + vertices[k + 3][2] = MyGeometry::depth / 2.0; + } +#endif + for (size_t i = 0; i < vertices.N(); ++i) gridFactory.insertVertex(vertices[i]); Dune::GeometryType cell; +#if DIM == 3 + cell.makeTetrahedron(); +#else cell.makeTriangle(); +#endif +#if DIM == 3 + std::vector<std::vector<unsigned int>> simplices = { { 0, 1, 2, 3 }, + { 1, 2, 3, 4 }, + { 2, 3, 4, 5 } }; +#else std::vector<std::vector<unsigned int>> simplices = { { 0, 1, 2 } }; +#endif // sanity-check choices of simplices for (size_t i = 0; i < simplices.size(); ++i) { @@ -32,16 +61,40 @@ template <class Grid> std::shared_ptr<Grid> constructGrid() { template <class GridView> MyFaces<GridView>::MyFaces(GridView const &gridView) - : lower(gridView), right(gridView) { + : +#if DIM == 3 + lower(gridView), + right(gridView), + front(gridView), + back(gridView) +#else + lower(gridView), + right(gridView) +#endif +{ using Grid = typename GridView::Grid; using LevelGridView = typename Grid::LevelGridView; LevelGridView const rootView = gridView.grid().levelView(0); + assert(isClose(MyGeometry::A[1], 0)); + assert(isClose(MyGeometry::B[1], 0)); lower.insertFacesByProperty([&]( typename Grid::LeafGridView::Intersection const &in) { return isClose(0, in.geometry().center()[1]); }); +#if DIM == 3 + front.insertFacesByProperty([&]( + typename Grid::LeafGridView::Intersection const &in) { + return isClose(-MyGeometry::depth / 2.0, in.geometry().center()[2]); + }); + + back.insertFacesByProperty([&]( + typename Grid::LeafGridView::Intersection const &in) { + return isClose(MyGeometry::depth / 2.0, in.geometry().center()[2]); + }); +#endif + BoundaryPatch<LevelGridView> upperRoot(rootView); upperRoot.insertFacesByProperty([&]( typename LevelGridView::Intersection const &in) { diff --git a/src/sand-wedge-data/mygrid.hh b/src/sand-wedge-data/mygrid.hh index 1f02943d..9cdde76a 100644 --- a/src/sand-wedge-data/mygrid.hh +++ b/src/sand-wedge-data/mygrid.hh @@ -21,6 +21,12 @@ template <class GridView> struct MyFaces { BoundaryPatch<GridView> lower; BoundaryPatch<GridView> right; BoundaryPatch<GridView> upper; + +#if DIM == 3 + BoundaryPatch<GridView> front; + BoundaryPatch<GridView> back; +#endif + MyFaces(GridView const &gridView); private: diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc index 264eb169..c58817d7 100644 --- a/src/sand-wedge.cc +++ b/src/sand-wedge.cc @@ -140,6 +140,11 @@ int main(int argc, char *argv[]) { if (myFaces.lower.containsVertex(i)) dirichletNodes[i][1] = true; + +#if DIM == 3 + if (myFaces.front.containsVertex(i) || myFaces.back.containsVertex(i)) + dirichletNodes[i][2] = true; +#endif } // Set up functions for time-dependent boundary conditions -- GitLab