dune-fem 2.8.0
Loading...
Searching...
No Matches
petsc.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_SPACE_MAPPER_PETSC_HH
2#define DUNE_FEM_SPACE_MAPPER_PETSC_HH
3
4#include <cassert>
5
6#include <memory>
7#include <tuple>
8#include <utility>
9
13
14namespace Dune
15{
16
17 namespace Fem
18 {
19
20 // PetscMappers
21 // ------------
22
23#if HAVE_PETSC
24 template< class DiscreteFunctionSpace >
25 class PetscMappers
26 {
27 typedef PetscMappers< DiscreteFunctionSpace > PetscMappersType;
28
29 public:
30 typedef DiscreteFunctionSpace DiscreteFunctionSpaceType;
31
32 typedef typename DiscreteFunctionSpaceType::BlockMapperType BlockMapperType;
33 typedef typename DiscreteFunctionSpaceType::GridPartType GridPartType;
34
35 typedef GhostDofMapper< GridPartType, BlockMapperType, PetscInt > GhostMapperType;
36 typedef ParallelDofMapper< GridPartType, GhostMapperType, PetscInt > ParallelMapperType;
37
38 private:
39 template< class Mapper >
40 struct MapperFactory
41 {
42 static std::pair< Mapper, int > *createObject ( std::pair< GridPartType *, typename Mapper::BaseMapperType * > key, int sequence )
43 {
44 return new std::pair< Mapper, int >( std::piecewise_construct, std::tie( *key.first, *key.second ), std::make_tuple( sequence ) );
45 }
46
47 static void deleteObject ( std::pair< Mapper, int > *object ) { delete object; }
48 };
49
50 template< class Mapper >
51 using MapperProvider = SingletonList< std::pair< GridPartType *, typename Mapper::BaseMapperType * >, std::pair< Mapper, int >, MapperFactory< Mapper > >;
52
53 typedef MapperProvider< GhostMapperType > GhostMapperProviderType;
54 typedef MapperProvider< ParallelMapperType > ParallelMapperProviderType;
55
56 public:
58 PetscMappers ( const DiscreteFunctionSpaceType &space )
59 : space_( space )
60 {
61 const int sequence = space_.sequence();
62
63 ghostMapper_.reset( &GhostMapperProviderType::getObject( std::make_pair( &space_.gridPart(), &space_.blockMapper() ), sequence ) );
64 update( *ghostMapper_, sequence );
65
66 parallelMapper_.reset( &ParallelMapperProviderType::getObject( std::make_pair( &space_.gridPart(), &ghostMapper_->first ), sequence ) );
67 update( *parallelMapper_, sequence );
68 }
69
71 PetscMappers ( const PetscMappers &other )
72 : space_( other.space_ )
73 {
74 const int sequence = space_.sequence();
75
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 ) );
78 }
79
80 const DiscreteFunctionSpaceType &space () const { return space_; }
81
82 const GhostMapperType &ghostMapper () const { assert( ghostMapper_ ); return ghostMapper_->first; }
83 const ParallelMapperType &parallelMapper () const { assert( parallelMapper_ ); return parallelMapper_->first; }
84
85 PetscInt ghostIndex ( const typename BlockMapperType::GlobalKeyType &index ) const
86 {
87 assert( static_cast< std::size_t >( index ) < size() );
88 return ghostMapper().mapping()[ index ];
89 }
90
91 PetscInt parallelIndex ( const typename BlockMapperType::GlobalKeyType &index ) const
92 {
93 return parallelMapper().mapping()[ ghostIndex( index ) ];
94 }
95
96 std::size_t size () const { return ghostMapper().mapping().size(); }
97
98 void update ()
99 {
100 const int sequence = space().sequence();
101
102 assert( ghostMapper_ );
103 update( *ghostMapper_, sequence );
104
105 assert( parallelMapper_ );
106 update( *parallelMapper_, sequence );
107 }
108
109 private:
110 template< class Mapper >
111 static void update ( std::pair< Mapper, int > &mapper, int sequence )
112 {
113 if( mapper.second != sequence )
114 {
115 mapper.first.update();
116 mapper.second = sequence;
117 }
118 }
119
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_;
123 };
124#endif // #if HAVE_PETSC
125
126 } // namespace Fem
127
128} // namespace Dune
129
130#endif // #ifndef DUNE_FEM_SPACE_MAPPER_PETSC_HH
Definition: bindguard.hh:11
discrete function space