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:243