1#ifndef DUNE_FEM_SPACE_COMMON_AUXILIARYDOFS_HH
2#define DUNE_FEM_SPACE_COMMON_AUXILIARYDOFS_HH
15#include <dune/common/exceptions.hh>
16#include <dune/common/genericiterator.hh>
17#include <dune/common/ftraits.hh>
18#include <dune/common/typetraits.hh>
20#include <dune/grid/common/gridenums.hh>
21#include <dune/grid/common/datahandleif.hh>
45 template<
class Gr
idPart,
class Mapper >
70 :
public std::iterator< std::forward_iterator_tag, const int, int >
75 const int &
operator* ()
const {
return (*auxiliarys_)[ index_ ]; }
76 const int *
operator-> ()
const {
return &(*auxiliarys_)[ index_ ]; }
78 const int &
operator[] (
int n )
const noexcept {
return (*auxiliarys_)[ index_ + n ]; }
133 [[deprecated(
"Use contains instead")]]
138 std::set< int > auxiliarySet;
150 for(
int codim = 1; codim <= GridPartType::dimension; ++codim )
152 if(
mapper_.contains( codim ) )
161 const auto idxpitype = GridPartType::indexSetPartitionType;
162 for(
auto it =
gridPart().
template begin< 0, idxpitype >(),
end =
gridPart().
template end< 0, idxpitype >(); it !=
end; ++it )
164 const auto& entity = *it;
165 if( entity.partitionType() != Dune::InteriorEntity )
166 mapper_.mapEachEntityDof( entity, [ &auxiliarySet ] (
int,
int value ) { auxiliarySet.insert( value ); } );
169 auxiliarySet.insert(
mapper_.size() );
181 gridPart().communicate( handle, GridPartType::indexSetInterfaceType, ForwardCommunication );
183 catch(
const Exception &e )
185 std::cerr << e << std::endl <<
"Exception thrown in: " << __FILE__ <<
" line:" << __LINE__ << std::endl;
190 auxiliarySet.insert(
mapper_.size() );
199 template<
class Gr
idPart,
class Mapper >
201 :
public CommDataHandleIF< LinkBuilder, int >
206 auxiliarySet_( auxiliarySet ),
mapper_( mapper )
210 bool fixedSize (
int dim,
int codim )
const {
return false; }
213 template<
class MessageBuffer,
class Entity >
214 void gather ( MessageBuffer &buffer,
const Entity &entity )
const
217 if( sendRank( entity ) )
218 buffer.write( myRank_ );
225 template<
class MessageBuffer,
class EntityType >
226 void scatter ( MessageBuffer &buffer,
const EntityType &entity, std::size_t n )
233 assert( (rank >= 0) && (rank < mySize_) );
236 if ( rank < myRank_ || ! sendRank( entity ) )
237 mapper_.mapEachEntityDof( entity, [
this](
const int ,
const auto& value ){auxiliarySet_.insert( value );} );
242 template<
class Entity >
243 std::size_t
size (
const Entity &entity )
const
245 return (sendRank( entity )) ? 1 : 0;
249 template <
class Entity>
252 const PartitionType ptype = entity.partitionType();
253 return (ptype == InteriorEntity) || (ptype == BorderEntity);
257 int myRank_, mySize_;
258 std::set< int > &auxiliarySet_;
273 template<
class AuxiliaryDofs >
276 template<
class Gr
idPart,
class Mapper >
282 :
public std::iterator< std::forward_iterator_tag, int, std::ptrdiff_t, Envelope< int >, int >
287 : index_( index ), auxiliary_( auxiliary )
291 : auxiliaryDofs_( &auxiliaryDofs ), index_( index ), auxiliary_( auxiliary )
296 int operator* ()
const {
return index_; }
299 bool operator== (
const ConstIterator &other )
const {
return (index_ == other.index_); }
300 bool operator!= (
const ConstIterator &other )
const {
return (index_ != other.index_); }
302 ConstIterator &operator++ () { ++index_; skipAuxiliarys();
return *
this; }
303 ConstIterator operator++ (
int ) { ConstIterator copy( *
this ); ++(*this);
return copy; }
307 bool contains(
const int index )
const {
return ! auxiliaryDofs().contains( index ); }
310 void skipAuxiliarys ()
312 const int aSize = auxiliaryDofs().size();
313 assert( auxiliary_ < aSize );
314 for( ; (index_ == auxiliaryDofs()[ auxiliary_ ]) && (++auxiliary_ != aSize); ++index_ )
318 const AuxiliaryDofsType *auxiliaryDofs_ =
nullptr;
319 int index_ = 0, auxiliary_ = 0;
323 : auxiliaryDofs_( auxiliaryDofs )
326 ConstIterator
begin ()
const {
return ConstIterator( auxiliaryDofs_, 0, 0 ); }
327 ConstIterator
end ()
const {
return ConstIterator( auxiliaryDofs_[ auxiliaryDofs_.size()-1 ], auxiliaryDofs_.size() ); }
329 int size ()
const {
return auxiliaryDofs_[ auxiliaryDofs_.size()-1 ] - (auxiliaryDofs_.size()-1); }
332 const AuxiliaryDofsType &auxiliaryDofs_;
340 template<
class AuxiliaryDofs >
346 template<
class AuxiliaryDofs >
347 [[deprecated(
"Use primaryDofs instead!" )]]
GridPart GridPartType
type of grid part
Definition: auxiliarydofs.hh:54
ConstIterator(const IndexMapType &auxiliarys, int index)
Definition: auxiliarydofs.hh:73
PrimaryDofs(const AuxiliaryDofsType &auxiliaryDofs)
Definition: auxiliarydofs.hh:322
Fem::CommunicationIndexMap IndexMapType
Definition: auxiliarydofs.hh:60
ConstIterator & operator++()
Definition: auxiliarydofs.hh:83
ConstIterator end() const
Definition: auxiliarydofs.hh:128
const int * operator->() const
Definition: auxiliarydofs.hh:76
int operator[](const int index) const
return dof number of auxiliary for index
Definition: auxiliarydofs.hh:116
static PrimaryDofs< AuxiliaryDofs > primaryDofs(const AuxiliaryDofs &auxiliaryDofs)
Definition: auxiliarydofs.hh:341
bool operator<(const ThisType &other) const noexcept
Definition: auxiliarydofs.hh:99
void rebuild()
Definition: auxiliarydofs.hh:136
const int & operator*() const
Definition: auxiliarydofs.hh:75
bool operator!=(const ConstIterator &other) const
Definition: auxiliarydofs.hh:81
IndexMapType auxiliarys_
Definition: auxiliarydofs.hh:66
void buildMaps(std::set< int > &auxiliarySet)
Definition: auxiliarydofs.hh:147
const AuxiliaryDofsType & auxiliaryDofs() const
Definition: auxiliarydofs.hh:305
ConstIterator begin() const
Definition: auxiliarydofs.hh:127
void buildCommunicatedMaps(std::set< int > &auxiliarySet)
Definition: auxiliarydofs.hh:172
void buildDiscontinuousMaps(std::set< int > &auxiliarySet)
Definition: auxiliarydofs.hh:158
const int & operator[](int n) const noexcept
Definition: auxiliarydofs.hh:78
bool contains(int index) const
return true if index is contained, meaning it is a auxiliary dof
Definition: auxiliarydofs.hh:131
const GridPartType & gridPart() const
Definition: auxiliarydofs.hh:144
ThisType & operator-=(int n) noexcept
Definition: auxiliarydofs.hh:90
bool contains(const int index) const
Definition: auxiliarydofs.hh:307
std::size_t size(const Entity &entity) const
return local dof size to be communicated
Definition: auxiliarydofs.hh:243
Mapper MapperType
type of used mapper
Definition: auxiliarydofs.hh:57
const MapperType & mapper_
Definition: auxiliarydofs.hh:63
AuxiliaryDofs(const GridPartType &gridPart, const MapperType &mapper)
Definition: auxiliarydofs.hh:109
ThisType & operator+=(int n) noexcept
Definition: auxiliarydofs.hh:89
void scatter(MessageBuffer &buffer, const EntityType &entity, std::size_t n)
Definition: auxiliarydofs.hh:226
bool fixedSize(int dim, int codim) const
Definition: auxiliarydofs.hh:210
friend ThisType operator+(int n, const ThisType &i) noexcept
Definition: auxiliarydofs.hh:95
bool isSlave(int index) const
Definition: auxiliarydofs.hh:134
bool operator==(const ConstIterator &other) const
Definition: auxiliarydofs.hh:80
bool operator<=(const ThisType &other) const noexcept
Definition: auxiliarydofs.hh:100
LinkBuilder(std::set< int > &auxiliarySet, const GridPartType &gridPart, const MapperType &mapper)
Definition: auxiliarydofs.hh:204
bool contains(int dim, int codim) const
Definition: auxiliarydofs.hh:209
AuxiliaryDofs(const AuxiliaryDofs &)=delete
int size() const
Definition: auxiliarydofs.hh:329
ConstIterator end() const
Definition: auxiliarydofs.hh:327
bool sendRank(const Entity &entity) const
Definition: auxiliarydofs.hh:250
int size() const
return number of auxiliary dofs
Definition: auxiliarydofs.hh:122
ThisType operator-(int n) const noexcept
Definition: auxiliarydofs.hh:93
static PrimaryDofs< AuxiliaryDofs > masterDofs(const AuxiliaryDofs &auxiliaryDofs)
Definition: auxiliarydofs.hh:348
ThisType & operator--() noexcept
Definition: auxiliarydofs.hh:86
bool operator>(const ThisType &other) const noexcept
Definition: auxiliarydofs.hh:102
const GridPartType & gridPart_
Definition: auxiliarydofs.hh:62
ConstIterator(int index, int auxiliary)
Definition: auxiliarydofs.hh:286
AuxiliaryDofs< GridPart, Mapper > AuxiliaryDofsType
Definition: auxiliarydofs.hh:279
ConstIterator begin() const
Definition: auxiliarydofs.hh:326
ConstIterator(const AuxiliaryDofsType &auxiliaryDofs, int index, int auxiliary)
Definition: auxiliarydofs.hh:290
void gather(MessageBuffer &buffer, const Entity &entity) const
read buffer and apply operation
Definition: auxiliarydofs.hh:214
bool operator>=(const ThisType &other) const noexcept
Definition: auxiliarydofs.hh:101
Definition: bindguard.hh:11
In parallel computations the dofs of a discrete function are made up by all primary dofs....
Definition: auxiliarydofs.hh:47
Definition: auxiliarydofs.hh:71
Definition: auxiliarydofs.hh:202
In parallel computations the dofs of a discrete function are made up by all primary dofs....
Definition: auxiliarydofs.hh:274
Definition: commindexmap.hh:16
void clear()
clear index map
Definition: commindexmap.hh:39
size_t size() const
return size of map
Definition: commindexmap.hh:82
void set(const std ::set< GlobalKey > &idxSet)
insert sorted set of indices
Definition: commindexmap.hh:66
Definition: envelope.hh:11