5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH
6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH
23#include <dune/common/enumset.hh>
26#include <dune/common/parallel/indexset.hh>
27#include <dune/common/parallel/communicator.hh>
28#include <dune/common/parallel/remoteindices.hh>
29#include <dune/common/parallel/mpicommunication.hh>
34#include <dune/common/parallel/communication.hh>
37template<
int dim,
template<
class,
class>
class Comm>
76 template <
class G,
class L>
111 DUNE_THROW(
ISTLError,
"OwnerOverlapCopyCommunication: global index not in index set");
112 localindices.insert(x);
125 DUNE_THROW(
ISTLError,
"OwnerOverlapCopyCommunication: global index not in index set");
126 remoteindices.insert(x);
144 return remoteindices;
152 localindices.clear();
153 remoteindices.clear();
158 std::set<IndexTripel> localindices;
160 std::set<RemoteIndexTripel> remoteindices;
172 template <
class GlobalIdType,
class LocalIdType=
int>
173 class OwnerOverlapCopyCommunication
175 template<
typename M,
typename G,
typename L>
183 typedef typename std::set<IndexTripel>::const_iterator localindex_iterator;
184 typedef typename std::set<RemoteIndexTripel>::const_iterator remoteindex_iterator;
186 typedef Dune::ParallelLocalIndex<AttributeSet> LI;
188 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512>
PIS;
189 typedef Dune::RemoteIndices<PIS>
RI;
190 typedef Dune::RemoteIndexListModifier<PIS,typename RI::Allocator,false>
RILM;
191 typedef typename RI::RemoteIndex
RX;
192 typedef Dune::BufferedCommunicator
BC;
193 typedef Dune::Interface
IF;
194 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>
OwnerSet;
195 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>
CopySet;
196 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,
AttributeSet>
OwnerOverlapSet;
197 typedef Dune::AllSet<AttributeSet>
AllSet;
205 typedef typename CommPolicy<T>::IndexedType
V;
220 typedef typename CommPolicy<T>::IndexedType
V;
235 if (OwnerOverlapToAllInterfaceBuilt)
236 OwnerOverlapToAllInterface.free();
238 Combine<OwnerOverlapSet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,
AttributeSet>
240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);
241 OwnerOverlapToAllInterfaceBuilt =
true;
246 if (OwnerToAllInterfaceBuilt)
247 OwnerToAllInterface.free();
250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);
251 OwnerToAllInterfaceBuilt =
true;
256 if (OwnerCopyToAllInterfaceBuilt)
257 OwnerCopyToAllInterface.free();
259 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,
AttributeSet> OwnerCopySet;
260 OwnerCopySet sourceFlags;
261 Combine<OwnerCopySet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,
AttributeSet> destFlags;
262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);
263 OwnerCopyToAllInterfaceBuilt =
true;
268 if (OwnerCopyToOwnerCopyInterfaceBuilt)
269 OwnerCopyToOwnerCopyInterface.free();
272 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,
AttributeSet> OwnerCopySet;
273 OwnerCopySet sourceFlags;
274 OwnerCopySet destFlags;
275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);
276 OwnerCopyToOwnerCopyInterfaceBuilt =
true;
281 if (CopyToAllInterfaceBuilt)
282 CopyToAllInterface.free();
285 CopyToAllInterface.build(ri,sourceFlags,destFlags);
286 CopyToAllInterfaceBuilt =
true;
313 if (!OwnerToAllInterfaceBuilt)
317 communicator.template forward<CopyGatherScatter<T> >(source,dest);
330 if (!CopyToAllInterfaceBuilt)
334 communicator.template forward<CopyGatherScatter<T> >(source,dest);
347 if (!OwnerOverlapToAllInterfaceBuilt)
350 communicator.template build<T>(OwnerOverlapToAllInterface);
351 communicator.template forward<AddGatherScatter<T> >(source,dest);
364 if (!OwnerCopyToAllInterfaceBuilt)
367 communicator.template build<T>(OwnerCopyToAllInterface);
368 communicator.template forward<AddGatherScatter<T> >(source,dest);
381 if (!OwnerCopyToOwnerCopyInterfaceBuilt)
384 communicator.template build<T>(OwnerCopyToOwnerCopyInterface);
385 communicator.template forward<AddGatherScatter<T> >(source,dest);
397 template<
class T1,
class T2>
398 void dot (
const T1& x,
const T1& y, T2& result)
const
400 using real_type =
typename FieldTraits<typename T1::field_type>::real_type;
402 if (mask.size()!=
static_cast<typename std::vector<double>::size_type
>(x.size()))
404 mask.resize(x.size());
405 for (
typename std::vector<double>::size_type i=0; i<mask.size(); i++)
407 for (
typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
409 mask[i->local().local()] = 0;
413 for (
typename T1::size_type i=0; i<x.size(); i++)
414 result += (x[i]*(y[i]))*
static_cast<real_type
>(mask[i]);
415 result = cc.sum(result);
425 typename FieldTraits<typename T1::field_type>::real_type
norm (
const T1& x)
const
427 using real_type =
typename FieldTraits<typename T1::field_type>::real_type;
430 if (mask.size()!=
static_cast<typename std::vector<double>::size_type
>(x.size()))
432 mask.resize(x.size());
433 for (
typename std::vector<double>::size_type i=0; i<mask.size(); i++)
435 for (
typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
437 mask[i->local().local()] = 0;
439 auto result = real_type(0.0);
440 for (
typename T1::size_type i=0; i<x.size(); i++)
441 result += Impl::asVector(x[i]).two_norm2()*mask[i];
443 return sqrt(cc.sum(result));
446 typedef Dune::EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>
CopyFlags;
498 if(pis.seqNo()==oldseqNo)
501 delete globalLookup_;
505 oldseqNo = pis.seqNo();
511 if(pis.seqNo()==oldseqNo)
514 delete globalLookup_;
517 oldseqNo = pis.seqNo();
522 delete globalLookup_;
528 assert(globalLookup_ != 0);
529 return *globalLookup_;
540 for (
typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
542 x[i->local().local()] = 0;
556 bool freecomm_ =
false)
557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),
558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),
573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri(pis,pis,MPI_COMM_WORLD),
574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm(false)
589 bool freecomm_ =
false)
590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),
591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt(false),
592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),
593 globalLookup_(0), category_(cat_), freecomm(freecomm_)
599 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::owner,true));
601 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::overlap,true));
603 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::copy,true));
611 ri.setIndexSets(pis,pis,cc);
614 remoteindex_iterator i=indexinfo.remoteIndices().begin();
615 int p = std::get<0>(*i);
616 RILM modifier = ri.template getModifier<false,true>(p);
617 typename PIS::const_iterator pi=pis.begin();
618 for ( ; i!=indexinfo.remoteIndices().end(); ++i)
621 if (p!=std::get<0>(*i))
624 modifier = ri.template getModifier<false,true>(p);
629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())
632 DUNE_THROW(ISTLError,
"OwnerOverlapCopyCommunication: global index not in index set");
636 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
637 modifier.insert(RX(OwnerOverlapCopyAttributeSet::owner,&(*pi)));
638 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
639 modifier.insert(RX(OwnerOverlapCopyAttributeSet::overlap,&(*pi)));
640 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
641 modifier.insert(RX(OwnerOverlapCopyAttributeSet::copy,&(*pi)));
645 ri.template getModifier<false,true>(0);
653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();
654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();
655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();
656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free();
657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();
658 if (globalLookup_)
delete globalLookup_;
659 if (freecomm && (comm != MPI_COMM_NULL))
664 int wasFinalized = 0;
665 MPI_Finalized(&wasFinalized);
667 MPI_Comm_free(&comm);
676 Communication<MPI_Comm> cc;
679 mutable IF OwnerToAllInterface;
680 mutable bool OwnerToAllInterfaceBuilt;
681 mutable IF OwnerOverlapToAllInterface;
682 mutable bool OwnerOverlapToAllInterfaceBuilt;
683 mutable IF OwnerCopyToAllInterface;
684 mutable bool OwnerCopyToAllInterfaceBuilt;
685 mutable IF OwnerCopyToOwnerCopyInterface;
686 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;
687 mutable IF CopyToAllInterface;
688 mutable bool CopyToAllInterfaceBuilt;
689 mutable std::vector<double> mask;
691 GlobalLookupIndexSet* globalLookup_;
void testRedistributed(int s)
Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
Definition allocator.hh:11
derive error class from the base class in common
Definition istlexception.hh:19
Attribute set for overlapping Schwarz.
Definition owneroverlapcopy.hh:59
AttributeSet
Definition owneroverlapcopy.hh:60
@ owner
Definition owneroverlapcopy.hh:61
@ copy
Definition owneroverlapcopy.hh:61
@ overlap
Definition owneroverlapcopy.hh:61
Information about the index distribution.
Definition owneroverlapcopy.hh:78
void addRemoteIndex(const RemoteIndexTripel &x)
Add a new remote index triple to the set of remote indices.
Definition owneroverlapcopy.hh:120
const std::set< IndexTripel > & localIndices() const
Get the set of indices local to the process.
Definition owneroverlapcopy.hh:133
G GlobalIdType
The type of the global index.
Definition owneroverlapcopy.hh:81
const std::set< RemoteIndexTripel > & remoteIndices() const
Get the set of remote indices.
Definition owneroverlapcopy.hh:142
std::tuple< int, GlobalIdType, int > RemoteIndexTripel
A triple describing a remote index.
Definition owneroverlapcopy.hh:99
void clear()
Remove all indices from the sets.
Definition owneroverlapcopy.hh:150
void addLocalIndex(const IndexTripel &x)
Add a new index triple to the set of local indices.
Definition owneroverlapcopy.hh:106
L LocalIdType
The type of the local index.
Definition owneroverlapcopy.hh:84
std::tuple< GlobalIdType, LocalIdType, int > IndexTripel
A triple describing a local index.
Definition owneroverlapcopy.hh:92
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition globalaggregates.hh:142
OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Constructor.
Definition owneroverlapcopy.hh:586
SolverCategory::Category category() const
Get Solver Category.
Definition owneroverlapcopy.hh:295
Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM
Definition owneroverlapcopy.hh:190
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition owneroverlapcopy.hh:456
void buildGlobalLookup(std::size_t size)
Definition owneroverlapcopy.hh:508
FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const
Compute the global Euclidean norm of a vector.
Definition owneroverlapcopy.hh:425
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:462
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet
Definition owneroverlapcopy.hh:195
void addOwnerOverlapToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points and add them to those values.
Definition owneroverlapcopy.hh:345
RemoteIndices & remoteIndices()
Get the underlying remote indices.
Definition owneroverlapcopy.hh:490
void addOwnerCopyToAll(const T &source, T &dest) const
Communicate values from owner and copy data points to all other data points and add them to those val...
Definition owneroverlapcopy.hh:362
OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::overlapping)
Construct the communication without any indices using MPI_COMM_WORLD.
Definition owneroverlapcopy.hh:572
void dot(const T1 &x, const T1 &y, T2 &result) const
Compute a global dot product of two vectors.
Definition owneroverlapcopy.hh:398
void buildGlobalLookup()
Definition owneroverlapcopy.hh:495
void addOwnerCopyToOwnerCopy(const T &source, T &dest) const
Communicate values from owner and copy data points to owner and copy data points and add them to thos...
Definition owneroverlapcopy.hh:379
Dune::RemoteIndices< PIS > RI
Definition owneroverlapcopy.hh:189
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition owneroverlapcopy.hh:328
void buildOwnerToAllInterface() const
Definition owneroverlapcopy.hh:244
EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
Definition owneroverlapcopy.hh:194
Dune::BufferedCommunicator BC
Definition owneroverlapcopy.hh:192
void buildOwnerCopyToAllInterface() const
Definition owneroverlapcopy.hh:254
void freeGlobalLookup()
Definition owneroverlapcopy.hh:520
void buildCopyToAllInterface() const
Definition owneroverlapcopy.hh:279
const GlobalLookupIndexSet & globalLookup() const
Definition owneroverlapcopy.hh:526
void buildOwnerOverlapToAllInterface() const
Definition owneroverlapcopy.hh:233
Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags
Definition owneroverlapcopy.hh:446
~OwnerOverlapCopyCommunication()
Definition owneroverlapcopy.hh:650
Dune::Interface IF
Definition owneroverlapcopy.hh:193
Dune::RemoteIndices< PIS > RemoteIndices
The type of the remote indices.
Definition owneroverlapcopy.hh:452
RI::RemoteIndex RX
Definition owneroverlapcopy.hh:191
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition owneroverlapcopy.hh:449
void buildOwnerCopyToOwnerCopyInterface() const
Definition owneroverlapcopy.hh:266
OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Construct the communication without any indices.
Definition owneroverlapcopy.hh:554
const Communication< MPI_Comm > & communicator() const
Definition owneroverlapcopy.hh:299
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS
Definition owneroverlapcopy.hh:188
ParallelIndexSet & indexSet()
Get the underlying parallel index set.
Definition owneroverlapcopy.hh:480
friend void loadMatrixMarket(M &, const std::string &, OwnerOverlapCopyCommunication< G, L > &, bool)
Load a parallel matrix/vector stored in matrix market format.
Definition matrixmarket.hh:1269
Dune::AllSet< AttributeSet > AllSet
Definition owneroverlapcopy.hh:197
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition owneroverlapcopy.hh:311
Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >, EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet > OwnerOverlapSet
Definition owneroverlapcopy.hh:196
void project(T1 &x) const
Set vector to zero at copy dofs.
Definition owneroverlapcopy.hh:538
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition owneroverlapcopy.hh:471
gather/scatter callback for communication
Definition owneroverlapcopy.hh:204
static V gather(const T &a, std::size_t i)
Definition owneroverlapcopy.hh:207
CommPolicy< T >::IndexedType V
Definition owneroverlapcopy.hh:205
static void scatter(T &a, V v, std::size_t i)
Definition owneroverlapcopy.hh:212
Definition owneroverlapcopy.hh:219
static V gather(const T &a, std::size_t i)
Definition owneroverlapcopy.hh:222
CommPolicy< T >::IndexedType V
Definition owneroverlapcopy.hh:220
static void scatter(T &a, V v, std::size_t i)
Definition owneroverlapcopy.hh:227
Category
Definition solvercategory.hh:23
@ overlapping
Category for overlapping solvers.
Definition solvercategory.hh:29