DUNE PDELab (2.7)

owneroverlapcopy.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH
4#define DUNE_ISTL_OWNEROVERLAPCOPY_HH
5
6#include <new>
7#include <iostream>
8#include <vector>
9#include <list>
10#include <map>
11#include <set>
12#include <tuple>
13
14#include "cmath"
15
16// MPI header
17#if HAVE_MPI
18#include <mpi.h>
19#endif
20
22
23#if HAVE_MPI
28#endif
29
30#include "solvercategory.hh"
31#include "istlexception.hh"
34
35template<int dim, template<class,class> class Comm>
36void testRedistributed(int s);
37
38
39namespace Dune {
40
57 {
58 enum AttributeSet {
59 owner=1, overlap=2, copy=3
60 };
61 };
62
74 template <class G, class L>
76 {
77 public:
79 typedef G GlobalIdType;
80
82 typedef L LocalIdType;
83
90 typedef std::tuple<GlobalIdType,LocalIdType,int> IndexTripel;
97 typedef std::tuple<int,GlobalIdType,int> RemoteIndexTripel;
98
105 {
106 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
107 std::get<2>(x)!=OwnerOverlapCopyAttributeSet::overlap &&
108 std::get<2>(x)!=OwnerOverlapCopyAttributeSet::copy)
109 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
110 localindices.insert(x);
111 }
112
119 {
120 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
121 std::get<2>(x)!=OwnerOverlapCopyAttributeSet::overlap &&
122 std::get<2>(x)!=OwnerOverlapCopyAttributeSet::copy)
123 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
124 remoteindices.insert(x);
125 }
126
131 const std::set<IndexTripel>& localIndices () const
132 {
133 return localindices;
134 }
135
140 const std::set<RemoteIndexTripel>& remoteIndices () const
141 {
142 return remoteindices;
143 }
144
148 void clear ()
149 {
150 localindices.clear();
151 remoteindices.clear();
152 }
153
154 private:
156 std::set<IndexTripel> localindices;
158 std::set<RemoteIndexTripel> remoteindices;
159 };
160
161
162#if HAVE_MPI
163
170 template <class GlobalIdType, class LocalIdType=int>
172 {
173 template<typename M, typename G, typename L>
174 friend void loadMatrixMarket(M&,
175 const std::string&,
177 bool);
178 // used types
181 typedef typename std::set<IndexTripel>::const_iterator localindex_iterator;
182 typedef typename std::set<RemoteIndexTripel>::const_iterator remoteindex_iterator;
183 typedef typename OwnerOverlapCopyAttributeSet::AttributeSet AttributeSet;
185 public:
189 typedef typename RI::RemoteIndex RX;
191 typedef Dune::Interface IF;
196 protected:
197
198
200 template<typename T>
202 {
203 typedef typename CommPolicy<T>::IndexedType V;
204
205 static V gather(const T& a, std::size_t i)
206 {
207 return a[i];
208 }
209
210 static void scatter(T& a, V v, std::size_t i)
211 {
212 a[i] = v;
213 }
214 };
215 template<typename T>
216 struct AddGatherScatter
217 {
218 typedef typename CommPolicy<T>::IndexedType V;
219
220 static V gather(const T& a, std::size_t i)
221 {
222 return a[i];
223 }
224
225 static void scatter(T& a, V v, std::size_t i)
226 {
227 a[i] += v;
228 }
229 };
230
231 void buildOwnerOverlapToAllInterface () const
232 {
233 if (OwnerOverlapToAllInterfaceBuilt)
234 OwnerOverlapToAllInterface.free();
235 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> OwnerOverlapSet;
236 typedef Combine<OwnerOverlapSet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> AllSet;
237 OwnerOverlapSet sourceFlags;
238 AllSet destFlags;
239 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);
240 OwnerOverlapToAllInterfaceBuilt = true;
241 }
242
243 void buildOwnerToAllInterface () const
244 {
245 if (OwnerToAllInterfaceBuilt)
246 OwnerToAllInterface.free();
247 OwnerSet sourceFlags;
248 AllSet destFlags;
249 OwnerToAllInterface.build(ri,sourceFlags,destFlags);
250 OwnerToAllInterfaceBuilt = true;
251 }
252
253 void buildOwnerCopyToAllInterface () const
254 {
255 if (OwnerCopyToAllInterfaceBuilt)
256 OwnerCopyToAllInterface.free();
257 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
258 typedef Combine<OwnerCopySet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> AllSet;
259 OwnerCopySet sourceFlags;
260 AllSet destFlags;
261 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);
262 OwnerCopyToAllInterfaceBuilt = true;
263 }
264
265 void buildOwnerCopyToOwnerCopyInterface () const
266 {
267 if (OwnerCopyToOwnerCopyInterfaceBuilt)
268 OwnerCopyToOwnerCopyInterface.free();
269 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
270 OwnerCopySet sourceFlags;
271 OwnerCopySet destFlags;
272 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);
273 OwnerCopyToOwnerCopyInterfaceBuilt = true;
274 }
275
276 void buildCopyToAllInterface () const
277 {
278 if (CopyToAllInterfaceBuilt)
279 CopyToAllInterface.free();
280 CopySet sourceFlags;
281 AllSet destFlags;
282 CopyToAllInterface.build(ri,sourceFlags,destFlags);
283 CopyToAllInterfaceBuilt = true;
284 }
285
286 public:
287
291 void
292 DUNE_DEPRECATED_MSG("The solver category can only be set in the constructor. This method is deprecated and will be removed after Dune 2.7")
294 category_ = set;
295 }
296
298 DUNE_DEPRECATED_MSG("This method is deprecated and will be removed after Dune 2.7, use category() instead.")
300 return category_;
301 }
302
308 return category_;
309 }
310
311 const CollectiveCommunication<MPI_Comm>& communicator() const
312 {
313 return cc;
314 }
315
322 template<class T>
323 void copyOwnerToAll (const T& source, T& dest) const
324 {
325 if (!OwnerToAllInterfaceBuilt)
326 buildOwnerToAllInterface ();
327 BC communicator;
328 communicator.template build<T>(OwnerToAllInterface);
329 communicator.template forward<CopyGatherScatter<T> >(source,dest);
330 communicator.free();
331 }
332
339 template<class T>
340 void copyCopyToAll (const T& source, T& dest) const
341 {
342 if (!CopyToAllInterfaceBuilt)
343 buildCopyToAllInterface ();
344 BC communicator;
345 communicator.template build<T>(CopyToAllInterface);
346 communicator.template forward<CopyGatherScatter<T> >(source,dest);
347 communicator.free();
348 }
349
356 template<class T>
357 void addOwnerOverlapToAll (const T& source, T& dest) const
358 {
359 if (!OwnerOverlapToAllInterfaceBuilt)
360 buildOwnerOverlapToAllInterface ();
361 BC communicator;
362 communicator.template build<T>(OwnerOverlapToAllInterface);
363 communicator.template forward<AddGatherScatter<T> >(source,dest);
364 communicator.free();
365 }
366
373 template<class T>
374 void addOwnerCopyToAll (const T& source, T& dest) const
375 {
376 if (!OwnerCopyToAllInterfaceBuilt)
377 buildOwnerCopyToAllInterface ();
378 BC communicator;
379 communicator.template build<T>(OwnerCopyToAllInterface);
380 communicator.template forward<AddGatherScatter<T> >(source,dest);
381 communicator.free();
382 }
383
390 template<class T>
391 void addOwnerCopyToOwnerCopy (const T& source, T& dest) const
392 {
393 if (!OwnerCopyToOwnerCopyInterfaceBuilt)
394 buildOwnerCopyToOwnerCopyInterface ();
395 BC communicator;
396 communicator.template build<T>(OwnerCopyToOwnerCopyInterface);
397 communicator.template forward<AddGatherScatter<T> >(source,dest);
398 communicator.free();
399 }
400
401
409 template<class T1, class T2>
410 void dot (const T1& x, const T1& y, T2& result) const
411 {
412 // set up mask vector
413 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
414 {
415 mask.resize(x.size());
416 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
417 mask[i] = 1;
418 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
419 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
420 mask[i->local().local()] = 0;
421 }
422 result = T2(0.0);
423
424 for (typename T1::size_type i=0; i<x.size(); i++)
425 result += x[i]*(y[i])*mask[i];
426 result = cc.sum(result);
427 }
428
435 template<class T1>
436 typename FieldTraits<typename T1::field_type>::real_type norm (const T1& x) const
437 {
438 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
439
440 // set up mask vector
441 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
442 {
443 mask.resize(x.size());
444 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
445 mask[i] = 1;
446 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
447 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
448 mask[i->local().local()] = 0;
449 }
450 auto result = real_type(0.0);
451 for (typename T1::size_type i=0; i<x.size(); i++)
452 result += Impl::asVector(x[i]).two_norm2()*mask[i];
453 return sqrt(cc.sum(result));
454 }
455
457
460
463
467
473 {
474 return pis;
475 }
476
482 {
483 return ri;
484 }
485
491 {
492 return pis;
493 }
494
495
501 {
502 return ri;
503 }
504
505 void buildGlobalLookup()
506 {
507 if(globalLookup_) {
508 if(pis.seqNo()==oldseqNo)
509 // Nothing changed!
510 return;
511 delete globalLookup_;
512 }
513
514 globalLookup_ = new GlobalLookupIndexSet(pis);
515 oldseqNo = pis.seqNo();
516 }
517
518 void buildGlobalLookup(std::size_t size)
519 {
520 if(globalLookup_) {
521 if(pis.seqNo()==oldseqNo)
522 // Nothing changed!
523 return;
524 delete globalLookup_;
525 }
526 globalLookup_ = new GlobalLookupIndexSet(pis, size);
527 oldseqNo = pis.seqNo();
528 }
529
530 void freeGlobalLookup()
531 {
532 delete globalLookup_;
533 globalLookup_=0;
534 }
535
536 const GlobalLookupIndexSet& globalLookup() const
537 {
538 assert(globalLookup_ != 0);
539 return *globalLookup_;
540 }
541
547 template<class T1>
548 void project (T1& x) const
549 {
550 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
551 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
552 x[i->local().local()] = 0;
553 }
554
566 bool freecomm_ = false)
567 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),
568 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
569 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
570 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),
571 freecomm(freecomm_)
572 {}
573
583 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri(pis,pis,MPI_COMM_WORLD),
584 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
585 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
586 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm(false)
587 {}
588
597 MPI_Comm comm_,
599 bool freecomm_ = false)
600 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),
601 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt(false),
602 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),
603 globalLookup_(0), category_(cat_), freecomm(freecomm_)
604 {
605 // set up an ISTL index set
606 pis.beginResize();
607 for (localindex_iterator i=indexinfo.localIndices().begin(); i!=indexinfo.localIndices().end(); ++i)
608 {
609 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
610 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::owner,true));
611 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
612 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::overlap,true));
613 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
614 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::copy,true));
615 // std::cout << cc.rank() << ": adding index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
616 }
617 pis.endResize();
618
619 // build remote indices WITHOUT communication
620 // std::cout << cc.rank() << ": build remote indices" << std::endl;
621 ri.setIndexSets(pis,pis,cc);
622 if (indexinfo.remoteIndices().size()>0)
623 {
624 remoteindex_iterator i=indexinfo.remoteIndices().begin();
625 int p = std::get<0>(*i);
626 RILM modifier = ri.template getModifier<false,true>(p);
627 typename PIS::const_iterator pi=pis.begin();
628 for ( ; i!=indexinfo.remoteIndices().end(); ++i)
629 {
630 // handle processor change
631 if (p!=std::get<0>(*i))
632 {
633 p = std::get<0>(*i);
634 modifier = ri.template getModifier<false,true>(p);
635 pi=pis.begin();
636 }
637
638 // position to correct entry in parallel index set
639 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())
640 ++pi;
641 if (pi==pis.end())
642 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
643
644 // insert entry
645 // std::cout << cc.rank() << ": adding remote index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
646 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
647 modifier.insert(RX(OwnerOverlapCopyAttributeSet::owner,&(*pi)));
648 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
649 modifier.insert(RX(OwnerOverlapCopyAttributeSet::overlap,&(*pi)));
650 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
651 modifier.insert(RX(OwnerOverlapCopyAttributeSet::copy,&(*pi)));
652 }
653 }else{
654 // Force remote indices to be synced!
655 ri.template getModifier<false,true>(0);
656 }
657 }
658
659 // destructor: free memory in some objects
661 {
662 ri.free();
663 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();
664 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();
665 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();
666 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free();
667 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();
668 if (globalLookup_) delete globalLookup_;
669 if (freecomm==true)
670 if(comm!=MPI_COMM_NULL)
671 {
672#ifdef MPI_2
673 // If it is possible to query whether MPI_Finalize
674 // was called, only free the communicator before
675 // calling MPI_Finalize.
676 int wasFinalized = 0;
677 MPI_Finalized( &wasFinalized );
678 if(!wasFinalized)
679#endif
680 MPI_Comm_free(&comm);
681 }
682 }
683
684 private:
686 {}
687 MPI_Comm comm;
688 CollectiveCommunication<MPI_Comm> cc;
689 PIS pis;
690 RI ri;
691 mutable IF OwnerToAllInterface;
692 mutable bool OwnerToAllInterfaceBuilt;
693 mutable IF OwnerOverlapToAllInterface;
694 mutable bool OwnerOverlapToAllInterfaceBuilt;
695 mutable IF OwnerCopyToAllInterface;
696 mutable bool OwnerCopyToAllInterfaceBuilt;
697 mutable IF OwnerCopyToOwnerCopyInterface;
698 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;
699 mutable IF CopyToAllInterface;
700 mutable bool CopyToAllInterfaceBuilt;
701 mutable std::vector<double> mask;
702 int oldseqNo;
703 GlobalLookupIndexSet* globalLookup_;
704 // re-intruduce const qualifier once deprecated setCategory got removed after Dune 2.7
705 /* const */ SolverCategory::Category category_;
706 bool freecomm;
707 };
708
709#endif
710
711
714} // end namespace
715
716#endif
A set containing everything.
Definition: enumset.hh:43
A communicator that uses buffers to gather and scatter the data to be send or received.
Definition: communicator.hh:459
void free()
Free the allocated memory (i.e. buffers and message information.
A set combining two other sets.
Definition: enumset.hh:110
A constant random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:377
A set consisting only of one item.
Definition: enumset.hh:60
derive error class from the base class in common
Definition: istlexception.hh:16
Information about the index distribution.
Definition: owneroverlapcopy.hh:76
std::tuple< GlobalIdType, LocalIdType, int > IndexTripel
A triple describing a local index.
Definition: owneroverlapcopy.hh:90
void addRemoteIndex(const RemoteIndexTripel &x)
Add a new remote index triple to the set of remote indices.
Definition: owneroverlapcopy.hh:118
G GlobalIdType
The type of the global index.
Definition: owneroverlapcopy.hh:79
const std::set< IndexTripel > & localIndices() const
Get the set of indices local to the process.
Definition: owneroverlapcopy.hh:131
const std::set< RemoteIndexTripel > & remoteIndices() const
Get the set of remote indices.
Definition: owneroverlapcopy.hh:140
L LocalIdType
The type of the local index.
Definition: owneroverlapcopy.hh:82
void clear()
Remove all indices from the sets.
Definition: owneroverlapcopy.hh:148
void addLocalIndex(const IndexTripel &x)
Add a new index triple to the set of local indices.
Definition: owneroverlapcopy.hh:104
std::tuple< int, GlobalIdType, int > RemoteIndexTripel
A triple describing a remote index.
Definition: owneroverlapcopy.hh:97
Communication interface between remote and local indices.
Definition: interface.hh:207
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition: owneroverlapcopy.hh:172
FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const
Compute the global Euclidean norm of a vector.
Definition: owneroverlapcopy.hh:436
OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Constructor.
Definition: owneroverlapcopy.hh:596
SolverCategory::Category category() const
Get Solver Category.
Definition: owneroverlapcopy.hh:307
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:391
RemoteIndices & remoteIndices()
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:500
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition: owneroverlapcopy.hh:472
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:357
Dune::RemoteIndices< PIS > RemoteIndices
The type of the remote indices.
Definition: owneroverlapcopy.hh:462
void project(T1 &x) const
Set vector to zero at copy dofs.
Definition: owneroverlapcopy.hh:548
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition: owneroverlapcopy.hh:340
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition: owneroverlapcopy.hh:466
OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Construct the communication without any indices.
Definition: owneroverlapcopy.hh:564
ParallelIndexSet & indexSet()
Get the underlying parallel index set.
Definition: owneroverlapcopy.hh:490
void dot(const T1 &x, const T1 &y, T2 &result) const
Compute a global dot product of two vectors.
Definition: owneroverlapcopy.hh:410
OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::overlapping)
Construct the communication without any indices using MPI_COMM_WORLD.
Definition: owneroverlapcopy.hh:582
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition: owneroverlapcopy.hh:323
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:481
friend void loadMatrixMarket(M &, const std::string &, OwnerOverlapCopyCommunication< G, L > &, bool)
Load a parallel matrix/vector stored in matrix market format.
Definition: matrixmarket.hh:1202
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:374
void setSolverCategory(SolverCategory::Category set)
Set right Solver Category (default is overlapping).
Definition: owneroverlapcopy.hh:293
SolverCategory::Category getSolverCategory() const
Definition: owneroverlapcopy.hh:299
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition: owneroverlapcopy.hh:459
An index present on the local process with an additional attribute flag.
Definition: plocalindex.hh:47
Modifier for adding and/or deleting remote indices from the remote index list.
Definition: remoteindices.hh:549
void insert(const RemoteIndex &index)
Insert an index to the list.
Definition: remoteindices.hh:1617
Information about an index residing on another processor.
Definition: remoteindices.hh:71
void setIndexSets(const ParallelIndexSet &source, const ParallelIndexSet &destination, const MPI_Comm &comm, const std::vector< int > &neighbours=std::vector< int >())
Set the index sets and communicator we work with.
Definition: remoteindices.hh:984
void free()
Free the index lists.
Definition: remoteindices.hh:1434
Implements an utility class that provides collective communication methods for sequential programs.
Provides utility classes for syncing distributed data via MPI communication.
Classes for building sets out of enumeration values.
void beginResize()
Indicate that the index set is to be resized.
void build(const R &remoteIndices, const T1 &sourceFlags, const T2 &destFlags)
Builds the interface.
Definition: interface.hh:459
void add(const GlobalIndex &global)
Add an new index to the set.
iterator begin()
Get an iterator over the indices positioned at the first index.
iterator end()
Get an iterator over the indices positioned after the last index.
void endResize()
Indicate that the resizing finishes.
int seqNo() const
Get the internal sequence number.
void free()
Frees memory allocated during the build.
Definition: interface.hh:490
#define DUNE_DEPRECATED_MSG(text)
Mark some entity as deprecated.
Definition: deprecated.hh:169
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
Provides a map between global and local indices.
Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
Implements an utility class that provides MPI's collective communication methods.
Dune namespace.
Definition: alignedallocator.hh:14
Classes describing a distributed indexset.
V::value_type IndexedType
The type we get at each index with operator[].
Definition: communicator.hh:146
Attribute set for overlapping Schwarz.
Definition: owneroverlapcopy.hh:57
gather/scatter callback for communcation
Definition: owneroverlapcopy.hh:202
Categories for the solvers.
Definition: solvercategory.hh:20
Category
Definition: solvercategory.hh:21
@ overlapping
Category for overlapping solvers.
Definition: solvercategory.hh:27
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)