1#ifndef DUNE_MULTIDOMAINGRID_FACTORY_HH
2#define DUNE_MULTIDOMAINGRID_FACTORY_HH
4#include <dune/grid/common/exceptions.hh>
6#include <dune/geometry/type.hh>
16template<
typename HostGr
id,
typename MDGr
idTraits>
22template <
class Gr
idType>
23class GridFactoryInterface;
25template <
class Gr
idType>
28template<
class HostGr
id,
class MDGTraits>
29class GridFactory<Dune::mdgrid::MultiDomainGrid<HostGrid, MDGTraits>> :
public GridFactoryInterface<Dune::mdgrid::MultiDomainGrid<HostGrid, MDGTraits>> {
32 using Base = GridFactoryInterface<Grid>;
36 : _host_grid_factory{}
40 using Base::insertBoundarySegment;
42 void insertVertex(
const FieldVector<typename Grid::ctype, Grid::dimensionworld>& pos)
override {
43 _host_grid_factory.insertVertex(pos);
46 void insertElement(
const GeometryType& type,
const std::vector<unsigned int>& vertices)
override {
47 _host_grid_factory.insertElement(type, vertices);
50 void insertBoundarySegment(
const std::vector<unsigned int>& vertices)
override {
51 _host_grid_factory.insertBoundarySegment(vertices);
54 std::unique_ptr<Grid> createGrid()
override {
58 return std::exchange(_grid_ptr,
nullptr);
61 void makeGrid(std::optional<typename MDGTraits::SubDomainIndex> max_subdomains = {}) {
62 assert(not _grid_ptr);
64 std::unique_ptr<MDGTraits> traits;
65 if constexpr (Grid::maxSubDomainIndexIsStatic())
66 traits = std::make_unique<MDGTraits>();
68 if (not max_subdomains.has_value())
69 DUNE_THROW(GridError,
"MultiDomainGrid needs a maximum number of subdomains, but none is provided");
70 traits = std::make_unique<MDGTraits>(*max_subdomains);
73 if (max_subdomains.has_value() and traits->maxSubDomainIndex() < *max_subdomains)
74 DUNE_THROW(GridError,
"Maximum number of sub-domains is bigger than what grid traits allows");
76 _grid_ptr = std::make_unique<Grid>(_host_grid_factory.createGrid(), *traits);
84 HostGrid& hostGrid() {
85 assert(_host_grid_ptr);
86 return *_host_grid_ptr;
89 const std::shared_ptr<HostGrid>& hostGridPtr() {
90 return _host_grid_ptr;
94 Dune::GridFactory<HostGrid>& hostGridFactory() {
95 return _host_grid_factory;
99 Dune::GridFactory<HostGrid> _host_grid_factory;
100 std::shared_ptr<HostGrid> _host_grid_ptr;
101 std::unique_ptr<Grid> _grid_ptr;
A meta grid for dividing an existing DUNE grid into subdomains that can be accessed as a grid in thei...
Definition: multidomaingrid.hh:247