1#ifndef DUNE_FEM_SPACE_MAPPER_PETSC_HH
2#define DUNE_FEM_SPACE_MAPPER_PETSC_HH
24 template<
class DiscreteFunctionSpace >
27 typedef PetscMappers< DiscreteFunctionSpace > PetscMappersType;
32 typedef typename DiscreteFunctionSpaceType::BlockMapperType BlockMapperType;
33 typedef typename DiscreteFunctionSpaceType::GridPartType GridPartType;
35 typedef GhostDofMapper< GridPartType, BlockMapperType, PetscInt > GhostMapperType;
36 typedef ParallelDofMapper< GridPartType, GhostMapperType, PetscInt > ParallelMapperType;
39 template<
class Mapper >
42 static std::pair< Mapper, int > *createObject ( std::pair< GridPartType *, typename Mapper::BaseMapperType * > key,
int sequence )
44 return new std::pair< Mapper, int >( std::piecewise_construct, std::tie( *key.first, *key.second ), std::make_tuple( sequence ) );
47 static void deleteObject ( std::pair< Mapper, int > *
object ) {
delete object; }
50 template<
class Mapper >
51 using MapperProvider = SingletonList< std::pair< GridPartType *, typename Mapper::BaseMapperType * >, std::pair< Mapper, int >, MapperFactory< Mapper > >;
53 typedef MapperProvider< GhostMapperType > GhostMapperProviderType;
54 typedef MapperProvider< ParallelMapperType > ParallelMapperProviderType;
58 PetscMappers (
const DiscreteFunctionSpaceType &space )
61 const int sequence = space_.sequence();
63 ghostMapper_.reset( &GhostMapperProviderType::getObject( std::make_pair( &space_.gridPart(), &space_.blockMapper() ), sequence ) );
64 update( *ghostMapper_, sequence );
66 parallelMapper_.reset( &ParallelMapperProviderType::getObject( std::make_pair( &space_.gridPart(), &ghostMapper_->first ), sequence ) );
67 update( *parallelMapper_, sequence );
71 PetscMappers (
const PetscMappers &other )
72 : space_( other.space_ )
74 const int sequence = space_.sequence();
76 ghostMapper_.reset( &GhostMapperProviderType::getObject( std::make_pair( &space_.gridPart(), &space_.blockMapper() ), sequence ) );
77 parallelMapper_.reset( &ParallelMapperProviderType::getObject( std::make_pair( &space_.gridPart(), &ghostMapper_->first ), sequence ) );
80 const DiscreteFunctionSpaceType &space ()
const {
return space_; }
82 const GhostMapperType &ghostMapper ()
const { assert( ghostMapper_ );
return ghostMapper_->first; }
83 const ParallelMapperType ¶llelMapper ()
const { assert( parallelMapper_ );
return parallelMapper_->first; }
85 PetscInt ghostIndex (
const typename BlockMapperType::GlobalKeyType &index )
const
87 assert(
static_cast< std::size_t
>( index ) < size() );
88 return ghostMapper().mapping()[ index ];
91 PetscInt parallelIndex (
const typename BlockMapperType::GlobalKeyType &index )
const
93 return parallelMapper().mapping()[ ghostIndex( index ) ];
96 std::size_t size ()
const {
return ghostMapper().mapping().size(); }
100 const int sequence = space().sequence();
102 assert( ghostMapper_ );
103 update( *ghostMapper_, sequence );
105 assert( parallelMapper_ );
106 update( *parallelMapper_, sequence );
110 template<
class Mapper >
111 static void update ( std::pair< Mapper, int > &mapper,
int sequence )
113 if( mapper.second != sequence )
115 mapper.first.update();
116 mapper.second = sequence;
120 const DiscreteFunctionSpaceType &space_;
121 std::unique_ptr< std::pair< GhostMapperType, int >,
typename GhostMapperProviderType::Deleter > ghostMapper_;
122 std::unique_ptr< std::pair< ParallelMapperType, int >,
typename ParallelMapperProviderType::Deleter > parallelMapper_;
Definition: bindguard.hh:11