diff --git a/dumux/io/grid/gridmanager_sub.hh b/dumux/io/grid/gridmanager_sub.hh index 74765677a114b91d7252b6c2487c6969608e677e..04a0690b5e29c8b5f7b5ef31f30ed35b243bfbff 100644 --- a/dumux/io/grid/gridmanager_sub.hh +++ b/dumux/io/grid/gridmanager_sub.hh @@ -40,13 +40,12 @@ #include <dune/grid/io/file/dgfparser/dgfwriter.hh> #endif -#ifndef DUMUX_IO_GRID_MANAGER_BASE_HH -#include <dumux/io/grid/gridmanager_base.hh> +#ifndef DUMUX_IO_GRID_MANAGER_HH +#include <dumux/io/grid/gridmanager.hh> #endif #include <dumux/common/parameters.hh> #include <dumux/common/boundaryflag.hh> -#include <dumux/io/grid/gridmanager_yasp.hh> #if HAVE_DUNE_SUBGRID namespace Dumux { @@ -214,15 +213,6 @@ protected: std::unique_ptr<HostGridManager> hostGridManager_; }; -// helper to distiguish between yasp grid and others -namespace Impl { -template<class Grid> -struct IsYasp : public std::false_type {}; - -template<int dim, class C> -struct IsYasp<Dune::YaspGrid<dim, C>> : public std::true_type {}; -} // end namespace Impl - /*! * \ingroup InputOutput * \brief Provides a grid manager for SubGrids @@ -231,9 +221,8 @@ struct IsYasp<Dune::YaspGrid<dim, C>> : public std::true_type {}; * The following keys are recognized: * - All parameters that the host grid knows */ -template<class HostGrid> -class GridManager<Dune::SubGrid<HostGrid::dimension, - typename std::enable_if_t<!Impl::IsYasp<HostGrid>{}, HostGrid>>> +template<int dim, class HostGrid> +class GridManager<Dune::SubGrid<dim, HostGrid>> : public SubGridManagerBase<HostGrid, GridManager<HostGrid>> {}; @@ -254,7 +243,7 @@ class GridManager<Dune::SubGrid<dim, Dune::YaspGrid<dim, Coordinates>>> using ParentType = SubGridManagerBase<Dune::YaspGrid<dim, Coordinates>, GridManager<Dune::YaspGrid<dim, Coordinates>>>; public: - using ParentType::Grid; + using typename ParentType::Grid; using ParentType::init; /*! diff --git a/test/io/gridmanager/CMakeLists.txt b/test/io/gridmanager/CMakeLists.txt index a2a0a008637d84c3e96521d337893d06140c2415..573860e17f09eac4fdedb15bdb083ff3dbe42164 100644 --- a/test/io/gridmanager/CMakeLists.txt +++ b/test/io/gridmanager/CMakeLists.txt @@ -35,7 +35,7 @@ dune_add_test(NAME test_gridmanager_subgrid CMD_ARGS --script fuzzy --command "${CMAKE_CURRENT_BINARY_DIR}/test_gridmanager_subgrid" --files ${CMAKE_SOURCE_DIR}/test/references/subgrid-reference.vtu - ${CMAKE_CURRENT_BINARY_DIR}/subgrid_three.vtu + ${CMAKE_CURRENT_BINARY_DIR}/subgrid_circle_yasp.vtu ${CMAKE_SOURCE_DIR}/test/references/test_gridmanager_subgrid_binary_image.vtu ${CMAKE_CURRENT_BINARY_DIR}/subgrid_binary_image.vtu) diff --git a/test/io/gridmanager/test_gridmanager_subgrid.cc b/test/io/gridmanager/test_gridmanager_subgrid.cc index 2ae3fb74556475c9b682c1c1593f78c5848bb961..23673ae2308e19c635d679e2ec52b3d11027a805 100644 --- a/test/io/gridmanager/test_gridmanager_subgrid.cc +++ b/test/io/gridmanager/test_gridmanager_subgrid.cc @@ -21,14 +21,20 @@ #include <config.h> #include <iostream> #include <cmath> +#include <string> #include <dune/common/parallel/mpihelper.hh> #include <dune/common/fvector.hh> #include <dune/common/timer.hh> #include <dune/grid/io/file/vtk.hh> +#include <dune/grid/yaspgrid.hh> +#if HAVE_DUNE_ALUGRID +#include <dune/alugrid/grid.hh> +#endif -#include <dumux/common/parameters.hh> #include <dumux/io/grid/gridmanager_sub.hh> +#include <dumux/common/parameters.hh> + /*! * \brief A method providing an () operator in order to select elements for a subgrid. @@ -52,22 +58,10 @@ private: const GlobalPosition center_; }; -int main(int argc, char** argv) try +template<int dim, class HostGrid> +void testSubGrid(const std::string& hostGridName) { - using namespace Dumux; - - // Initialize MPI, finalize is done automatically on exit. - Dune::MPIHelper::instance(argc, argv); - - // First read parameters from input file. - Dumux::Parameters::init(argc, argv); - - constexpr int dim = 2; - using GlobalPosition = Dune::FieldVector<double, dim>; - - Dune::Timer timer; - using HostGrid = Dune::YaspGrid<dim, Dune::TensorProductCoordinates<double, dim> >; - using SubGridTensor = Dune::SubGrid<dim, HostGrid>; + using SubGrid = Dune::SubGrid<dim, HostGrid>; using HostGridManager = Dumux::GridManager<HostGrid>; HostGridManager externalHostGridManager; @@ -75,6 +69,7 @@ int main(int argc, char** argv) try auto& hostGrid = externalHostGridManager.grid(); // Calculate the bounding box of the host grid view. + using GlobalPosition = Dune::FieldVector<double, dim>; GlobalPosition bBoxMin(std::numeric_limits<double>::max()); GlobalPosition bBoxMax(std::numeric_limits<double>::min()); for (const auto& vertex : vertices(hostGrid.leafGridView())) @@ -93,13 +88,13 @@ int main(int argc, char** argv) try // Write out the host grid and the subgrids. { - Dune::VTKWriter<HostGrid::LeafGridView> vtkWriter(hostGrid.leafGridView()); + Dune::VTKWriter<typename HostGrid::LeafGridView> vtkWriter(hostGrid.leafGridView()); vtkWriter.write("hostgrid"); } // Create different subgrids from the same hostgrid { - std::cout << "Constructing SubGrid with tensor host grid and lambda element selector" << std::endl; + std::cout << "Constructing SubGrid with host grid and lambda element selector" << std::endl; // Select all elements right of the center. auto elementSelector = [¢er](const auto& element) @@ -107,23 +102,10 @@ int main(int argc, char** argv) try return element.geometry().center()[0] > center[0]; }; - Dumux::GridManager<SubGridTensor> subgridManager; - subgridManager.init(hostGrid, elementSelector); - Dune::VTKWriter<SubGridTensor::LeafGridView> vtkWriter(subgridManager.grid().leafGridView()); - vtkWriter.write("subgrid_one"); - } - { - std::cout << "Constructing SubGrid with tensor host grid and functor selector" << std::endl; - - // Select all elements within a circle around the center. - // Instead of a lambda, we use a class providing an () operator. - // Of course, a lambda would be possible here, too. - CircleSelector<GlobalPosition> elementSelector(center); - - Dumux::GridManager<Dune::SubGrid<2, HostGrid>> subgridManager; + Dumux::GridManager<SubGrid> subgridManager; subgridManager.init(hostGrid, elementSelector); - Dune::VTKWriter<SubGridTensor::LeafGridView> vtkWriter(subgridManager.grid().leafGridView()); - vtkWriter.write("subgrid_three"); + Dune::VTKWriter<typename SubGrid::LeafGridView> vtkWriter(subgridManager.grid().leafGridView()); + vtkWriter.write("subgrid_right"); } // create without contructing host grid first @@ -138,11 +120,55 @@ int main(int argc, char** argv) try Dumux::GridManager<Dune::SubGrid<2, HostGrid>> subgridManager; subgridManager.init(elementSelector, "Internal"); - Dune::VTKWriter<SubGridTensor::LeafGridView> vtkWriter(subgridManager.grid().leafGridView()); - vtkWriter.write("subgrid_two"); + Dune::VTKWriter<typename SubGrid::LeafGridView> vtkWriter(subgridManager.grid().leafGridView()); + vtkWriter.write("subgrid_left"); + } + + { + std::cout << "Constructing SubGrid with host grid and functor selector" << std::endl; + + // Select all elements within a circle around the center. + // Instead of a lambda, we use a class providing an () operator. + // Of course, a lambda would be possible here, too. + CircleSelector<GlobalPosition> elementSelector(center); + + Dumux::GridManager<SubGrid> subgridManager; + subgridManager.init(hostGrid, elementSelector); + Dune::VTKWriter<typename SubGrid::LeafGridView> vtkWriter(subgridManager.grid().leafGridView()); + vtkWriter.write("subgrid_circle_" + hostGridName); + } +} + +int main(int argc, char** argv) try +{ + using namespace Dumux; + + // Initialize MPI, finalize is done automatically on exit. + Dune::MPIHelper::instance(argc, argv); + + // First read parameters from input file. + Dumux::Parameters::init(argc, argv); + + constexpr int dim = 2; + + { + Dune::Timer timer; + using HostGrid = Dune::YaspGrid<dim, Dune::TensorProductCoordinates<double, dim> >; + testSubGrid<dim, HostGrid>("yasp"); + std::cout << "Constructing a yasp host grid and three subgrids took " << timer.elapsed() << " seconds.\n"; + } + + { +#if HAVE_DUNE_ALUGRID + Dune::Timer timer; + using HostGrid = Dune::ALUGrid<dim, dim, Dune::cube, Dune::nonconforming>; + testSubGrid<dim, HostGrid>("alu"); + std::cout << "Constructing a alu host grid and three subgrids took " << timer.elapsed() << " seconds.\n"; +#else + std::cout << "Skipped test with ALUGrid as host grid.\n"; +#endif } - // create subgrid from image file { std::cout << "Constructing SubGrid from binary image" << std::endl; using HostGrid = Dune::YaspGrid<2, Dune::EquidistantOffsetCoordinates<double, 2>>; @@ -152,8 +178,6 @@ int main(int argc, char** argv) try vtkWriter.write("subgrid_binary_image"); } - std::cout << "Constructing a host grid and four subgrids took " << timer.elapsed() << " seconds.\n"; - return 0; } /////////////////////////////////////// diff --git a/test/io/gridmanager/test_gridmanager_subgrid.input b/test/io/gridmanager/test_gridmanager_subgrid.input index 91d3347d68916e6d9d7244f149cb264677980d9b..466e42cf7babe229c1529b5b6117a5f88960beb3 100644 --- a/test/io/gridmanager/test_gridmanager_subgrid.input +++ b/test/io/gridmanager/test_gridmanager_subgrid.input @@ -3,6 +3,8 @@ Positions0 = 0 1 Positions1 = 0 1 Cells0 = 1 Cells1 = 1 +UpperRight = 1 1 +Cells = 1 1 Refinement = 4 [Internal.Grid] @@ -10,6 +12,8 @@ Positions0 = 0 1 Positions1 = 0 1 Cells0 = 1 Cells1 = 1 +UpperRight = 1 1 +Cells = 1 1 Refinement = 4 [Image.Grid]