Dune Core Modules (2.3.1)

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// $Id$
4#ifndef DUNE_OWNEROVERLAPCOPY_HH
5#define DUNE_OWNEROVERLAPCOPY_HH
6
7#include <new>
8#include <iostream>
9#include <vector>
10#include <list>
11#include <map>
12#include <set>
13
14#include "cmath"
15
16// MPI header
17#if HAVE_MPI
18#include <mpi.h>
19#endif
20
21
22#include <dune/common/tuples.hh>
24
25#if HAVE_MPI
30#endif
31
32#include "solvercategory.hh"
33#include "istlexception.hh"
35
36template<int dim, template<class,class> class Comm>
37void testRedistributed(int s);
38
39
40namespace Dune {
41
58 {
59 enum AttributeSet {
60 owner=1, overlap=2, copy=3
61 };
62 };
63
75 template <class G, class L>
77 {
78 public:
80 typedef G GlobalIdType;
81
83 typedef L LocalIdType;
84
99
106 {
107 if (get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
108 get<2>(x)!=OwnerOverlapCopyAttributeSet::overlap &&
109 get<2>(x)!=OwnerOverlapCopyAttributeSet::copy)
110 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
111 localindices.insert(x);
112 }
113
120 {
121 if (get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
122 get<2>(x)!=OwnerOverlapCopyAttributeSet::overlap &&
123 get<2>(x)!=OwnerOverlapCopyAttributeSet::copy)
124 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
125 remoteindices.insert(x);
126 }
127
132 const std::set<IndexTripel>& localIndices () const
133 {
134 return localindices;
135 }
136
141 const std::set<RemoteIndexTripel>& remoteIndices () const
142 {
143 return remoteindices;
144 }
145
149 void clear ()
150 {
151 localindices.clear();
152 remoteindices.clear();
153 }
154
155 private:
157 std::set<IndexTripel> localindices;
159 std::set<RemoteIndexTripel> remoteindices;
160 };
161
162
163#if HAVE_MPI
164
171 template <class GlobalIdType, class LocalIdType=int>
173 {
174 template<typename M, typename G, typename L>
175 friend void loadMatrixMarket(M&,
176 const std::string&,
178 bool);
179 // used types
182 typedef typename std::set<IndexTripel>::const_iterator localindex_iterator;
183 typedef typename std::set<RemoteIndexTripel>::const_iterator remoteindex_iterator;
184 typedef typename OwnerOverlapCopyAttributeSet::AttributeSet AttributeSet;
186 public:
190 typedef typename RI::RemoteIndex RX;
192 typedef Dune::Interface IF;
197 protected:
198
199
201 template<typename T>
203 {
204 typedef typename CommPolicy<T>::IndexedType V;
205
206 static V gather(const T& a, std::size_t i)
207 {
208 return a[i];
209 }
210
211 static void scatter(T& a, V v, std::size_t i)
212 {
213 a[i] = v;
214 }
215 };
216 template<typename T>
217 struct AddGatherScatter
218 {
219 typedef typename CommPolicy<T>::IndexedType V;
220
221 static V gather(const T& a, std::size_t i)
222 {
223 return a[i];
224 }
225
226 static void scatter(T& a, V v, std::size_t i)
227 {
228 a[i] += v;
229 }
230 };
231
232 void buildOwnerOverlapToAllInterface () const
233 {
234 if (OwnerOverlapToAllInterfaceBuilt)
235 OwnerOverlapToAllInterface.free();
236 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> OwnerOverlapSet;
237 typedef Combine<OwnerOverlapSet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> AllSet;
238 OwnerOverlapSet sourceFlags;
239 AllSet destFlags;
240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);
241 OwnerOverlapToAllInterfaceBuilt = true;
242 }
243
244 void buildOwnerToAllInterface () const
245 {
246 if (OwnerToAllInterfaceBuilt)
247 OwnerToAllInterface.free();
248 OwnerSet sourceFlags;
249 AllSet destFlags;
250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);
251 OwnerToAllInterfaceBuilt = true;
252 }
253
254 void buildOwnerCopyToAllInterface () const
255 {
256 if (OwnerCopyToAllInterfaceBuilt)
257 OwnerCopyToAllInterface.free();
258 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
259 typedef Combine<OwnerCopySet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> AllSet;
260 OwnerCopySet sourceFlags;
261 AllSet destFlags;
262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);
263 OwnerCopyToAllInterfaceBuilt = true;
264 }
265
266 void buildOwnerCopyToOwnerCopyInterface () const
267 {
268 if (OwnerCopyToOwnerCopyInterfaceBuilt)
269 OwnerCopyToOwnerCopyInterface.free();
270 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
271 OwnerCopySet sourceFlags;
272 OwnerCopySet destFlags;
273 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);
274 OwnerCopyToOwnerCopyInterfaceBuilt = true;
275 }
276
277 void buildCopyToAllInterface () const
278 {
279 if (CopyToAllInterfaceBuilt)
280 CopyToAllInterface.free();
281 CopySet sourceFlags;
282 AllSet destFlags;
283 CopyToAllInterface.build(ri,sourceFlags,destFlags);
284 CopyToAllInterfaceBuilt = true;
285 }
286
287 public:
288
294 category = set;
295 }
296
303 return category;
304 }
305
306 const CollectiveCommunication<MPI_Comm>& communicator() const
307 {
308 return cc;
309 }
310
317 template<class T>
318 void copyOwnerToAll (const T& source, T& dest) const
319 {
320 if (!OwnerToAllInterfaceBuilt)
321 buildOwnerToAllInterface ();
322 BC communicator;
323 communicator.template build<T>(OwnerToAllInterface);
324 communicator.template forward<CopyGatherScatter<T> >(source,dest);
325 communicator.free();
326 }
327
334 template<class T>
335 void copyCopyToAll (const T& source, T& dest) const
336 {
337 if (!CopyToAllInterfaceBuilt)
338 buildCopyToAllInterface ();
339 BC communicator;
340 communicator.template build<T>(CopyToAllInterface);
341 communicator.template forward<CopyGatherScatter<T> >(source,dest);
342 communicator.free();
343 }
344
351 template<class T>
352 void addOwnerOverlapToAll (const T& source, T& dest) const
353 {
354 if (!OwnerOverlapToAllInterfaceBuilt)
355 buildOwnerOverlapToAllInterface ();
356 BC communicator;
357 communicator.template build<T>(OwnerOverlapToAllInterface);
358 communicator.template forward<AddGatherScatter<T> >(source,dest);
359 communicator.free();
360 }
361
368 template<class T>
369 void addOwnerCopyToAll (const T& source, T& dest) const
370 {
371 if (!OwnerCopyToAllInterfaceBuilt)
372 buildOwnerCopyToAllInterface ();
373 BC communicator;
374 communicator.template build<T>(OwnerCopyToAllInterface);
375 communicator.template forward<AddGatherScatter<T> >(source,dest);
376 communicator.free();
377 }
378
385 template<class T>
386 void addOwnerCopyToOwnerCopy (const T& source, T& dest) const
387 {
388 if (!OwnerCopyToOwnerCopyInterfaceBuilt)
389 buildOwnerCopyToOwnerCopyInterface ();
390 BC communicator;
391 communicator.template build<T>(OwnerCopyToOwnerCopyInterface);
392 communicator.template forward<AddGatherScatter<T> >(source,dest);
393 communicator.free();
394 }
395
396
404 template<class T1, class T2>
405 void dot (const T1& x, const T1& y, T2& result) const
406 {
407 // set up mask vector
408 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
409 {
410 mask.resize(x.size());
411 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
412 mask[i] = 1;
413 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
414 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
415 mask[i->local().local()] = 0;
416 }
417 result = 0;
418
419 for (typename T1::size_type i=0; i<x.size(); i++)
420 result += x[i]*(y[i])*mask[i];
421 result = cc.sum(result);
422 return;
423 }
424
431 template<class T1>
432 double norm (const T1& x) const
433 {
434 // set up mask vector
435 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
436 {
437 mask.resize(x.size());
438 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
439 mask[i] = 1;
440 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
441 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
442 mask[i->local().local()] = 0;
443 }
444 double result = 0;
445 for (typename T1::size_type i=0; i<x.size(); i++)
446 result += x[i].two_norm2()*mask[i];
447 return sqrt(cc.sum(result));
448 }
449
451
454
457
461
467 {
468 return pis;
469 }
470
476 {
477 return ri;
478 }
479
485 {
486 return pis;
487 }
488
489
495 {
496 return ri;
497 }
498
499 void buildGlobalLookup()
500 {
501 if(globalLookup_) {
502 if(pis.seqNo()==oldseqNo)
503 // Nothing changed!
504 return;
505 delete globalLookup_;
506 }
507
508 globalLookup_ = new GlobalLookupIndexSet(pis);
509 oldseqNo = pis.seqNo();
510 }
511
512 void buildGlobalLookup(std::size_t size)
513 {
514 if(globalLookup_) {
515 if(pis.seqNo()==oldseqNo)
516 // Nothing changed!
517 return;
518 delete globalLookup_;
519 }
520 globalLookup_ = new GlobalLookupIndexSet(pis, size);
521 oldseqNo = pis.seqNo();
522 }
523
524 void freeGlobalLookup()
525 {
526 delete globalLookup_;
527 globalLookup_=0;
528 }
529
530 const GlobalLookupIndexSet& globalLookup() const
531 {
532 assert(globalLookup_ != 0);
533 return *globalLookup_;
534 }
535
541 template<class T1>
542 void project (T1& x) const
543 {
544 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
545 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
546 x[i->local().local()] = 0;
547 }
548
560 bool freecomm_ = false)
561 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),
562 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
563 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
564 CopyToAllInterfaceBuilt(false), globalLookup_(0), category(cat_),
565 freecomm(freecomm_)
566 {}
567
577 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri(pis,pis,MPI_COMM_WORLD),
578 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
579 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
580 CopyToAllInterfaceBuilt(false), globalLookup_(0), category(cat_), freecomm(false)
581 {}
582
591 MPI_Comm comm_,
593 bool freecomm_ = false)
594 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),
595 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt(false),
596 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),
597 globalLookup_(0), category(cat_), freecomm(freecomm_)
598 {
599 // set up an ISTL index set
600 pis.beginResize();
601 for (localindex_iterator i=indexinfo.localIndices().begin(); i!=indexinfo.localIndices().end(); ++i)
602 {
603 if (get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
604 pis.add(get<0>(*i),LI(get<1>(*i),OwnerOverlapCopyAttributeSet::owner,true));
605 if (get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
606 pis.add(get<0>(*i),LI(get<1>(*i),OwnerOverlapCopyAttributeSet::overlap,true));
607 if (get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
608 pis.add(get<0>(*i),LI(get<1>(*i),OwnerOverlapCopyAttributeSet::copy,true));
609 // std::cout << cc.rank() << ": adding index " << get<0>(*i) << " " << get<1>(*i) << " " << get<2>(*i) << std::endl;
610 }
611 pis.endResize();
612
613 // build remote indices WITHOUT communication
614 // std::cout << cc.rank() << ": build remote indices" << std::endl;
615 ri.setIndexSets(pis,pis,cc);
616 if (indexinfo.remoteIndices().size()>0)
617 {
618 remoteindex_iterator i=indexinfo.remoteIndices().begin();
619 int p = get<0>(*i);
620 RILM modifier = ri.template getModifier<false,true>(p);
621 typename PIS::const_iterator pi=pis.begin();
622 for ( ; i!=indexinfo.remoteIndices().end(); ++i)
623 {
624 // handle processor change
625 if (p!=get<0>(*i))
626 {
627 p = get<0>(*i);
628 modifier = ri.template getModifier<false,true>(p);
629 pi=pis.begin();
630 }
631
632 // position to correct entry in parallel index set
633 while (pi->global()!=get<1>(*i) && pi!=pis.end())
634 ++pi;
635 if (pi==pis.end())
636 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
637
638 // insert entry
639 // std::cout << cc.rank() << ": adding remote index " << get<0>(*i) << " " << get<1>(*i) << " " << get<2>(*i) << std::endl;
640 if (get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
641 modifier.insert(RX(OwnerOverlapCopyAttributeSet::owner,&(*pi)));
642 if (get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
643 modifier.insert(RX(OwnerOverlapCopyAttributeSet::overlap,&(*pi)));
644 if (get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
645 modifier.insert(RX(OwnerOverlapCopyAttributeSet::copy,&(*pi)));
646 }
647 }else{
648 // Force remote indices to be synced!
649 ri.template getModifier<false,true>(0);
650 }
651 }
652
653 // destructor: free memory in some objects
655 {
656 ri.free();
657 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();
658 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();
659 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();
660 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free();
661 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();
662 if (globalLookup_) delete globalLookup_;
663 if (freecomm==true)
664 if(comm!=MPI_COMM_NULL)
665 {
666#ifdef MPI_2
667 // If it is possible to query whether MPI_Finalize
668 // was called, only free the communicator before
669 // calling MPI_Finalize.
670 int wasFinalized = 0;
671 MPI_Finalized( &wasFinalized );
672 if(!wasFinalized)
673#endif
674 MPI_Comm_free(&comm);
675 }
676 }
677
678 private:
680 {}
681 MPI_Comm comm;
682 CollectiveCommunication<MPI_Comm> cc;
683 PIS pis;
684 RI ri;
685 mutable IF OwnerToAllInterface;
686 mutable bool OwnerToAllInterfaceBuilt;
687 mutable IF OwnerOverlapToAllInterface;
688 mutable bool OwnerOverlapToAllInterfaceBuilt;
689 mutable IF OwnerCopyToAllInterface;
690 mutable bool OwnerCopyToAllInterfaceBuilt;
691 mutable IF OwnerCopyToOwnerCopyInterface;
692 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;
693 mutable IF CopyToAllInterface;
694 mutable bool CopyToAllInterfaceBuilt;
695 mutable std::vector<double> mask;
696 int oldseqNo;
697 GlobalLookupIndexSet* globalLookup_;
699 bool freecomm;
700 };
701
702#endif
703
704
707} // end namespace
708
709#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:453
void free()
Free the allocated memory (i.e. buffers and message information.
Specialization of CollectiveCommunication for MPI.
Definition: mpicollectivecommunication.hh:146
T sum(T &in) const
Compute the sum of the argument over all processes and return the result in every process....
Definition: mpicollectivecommunication.hh:175
A set combining two other sets.
Definition: enumset.hh:110
A constant random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:380
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:77
tuple< GlobalIdType, LocalIdType, int > IndexTripel
A triple describing a local index.
Definition: owneroverlapcopy.hh:91
void addRemoteIndex(const RemoteIndexTripel &x)
Add a new remote index triple to the set of remote indices.
Definition: owneroverlapcopy.hh:119
G GlobalIdType
The type of the global index.
Definition: owneroverlapcopy.hh:80
const std::set< IndexTripel > & localIndices() const
Get the set of indices local to the process.
Definition: owneroverlapcopy.hh:132
const std::set< RemoteIndexTripel > & remoteIndices() const
Get the set of remote indices.
Definition: owneroverlapcopy.hh:141
L LocalIdType
The type of the local index.
Definition: owneroverlapcopy.hh:83
void clear()
Remove all indices from the sets.
Definition: owneroverlapcopy.hh:149
tuple< int, GlobalIdType, int > RemoteIndexTripel
A triple describing a remote index.
Definition: owneroverlapcopy.hh:98
void addLocalIndex(const IndexTripel &x)
Add a new index triple to the set of local indices.
Definition: owneroverlapcopy.hh:105
Communication interface between remote and local indices.
Definition: interface.hh:208
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition: owneroverlapcopy.hh:173
OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Constructor.
Definition: owneroverlapcopy.hh:590
double norm(const T1 &x) const
Compute the global euclidian norm of a vector.
Definition: owneroverlapcopy.hh:432
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:386
RemoteIndices & remoteIndices()
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:494
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition: owneroverlapcopy.hh:466
const SolverCategory::Category getSolverCategory() const
Set Solver Category.
Definition: owneroverlapcopy.hh:302
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:352
Dune::RemoteIndices< PIS > RemoteIndices
The type of the remote indices.
Definition: owneroverlapcopy.hh:456
void project(T1 &x) const
Set vector to zero at copy dofs.
Definition: owneroverlapcopy.hh:542
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition: owneroverlapcopy.hh:335
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition: owneroverlapcopy.hh:460
OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
Construct the communication without any indices.
Definition: owneroverlapcopy.hh:558
ParallelIndexSet & indexSet()
Get the underlying parallel index set.
Definition: owneroverlapcopy.hh:484
void dot(const T1 &x, const T1 &y, T2 &result) const
Compute a global dot product of two vectors.
Definition: owneroverlapcopy.hh:405
OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::overlapping)
Construct the communication without any indices using MPI_COMM_WORLD.
Definition: owneroverlapcopy.hh:576
void setSolverCategory(SolverCategory set)
Set right Solver Category (default is overlapping).
Definition: owneroverlapcopy.hh:293
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition: owneroverlapcopy.hh:318
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:475
friend void loadMatrixMarket(M &, const std::string &, OwnerOverlapCopyCommunication< G, L > &, bool)
Load a parallel matrix/vector stored in matrix market format.
Definition: matrixmarket.hh:1044
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:369
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition: owneroverlapcopy.hh:453
An index present on the local process with an additional attribute flag.
Definition: plocalindex.hh:48
Modifier for adding and/or deleting remote indices from the remote index list.
Definition: remoteindices.hh:546
void insert(const RemoteIndex &index)
Insert an index to the list.
Definition: remoteindices.hh:1607
Information about an index residing on another processor.
Definition: remoteindices.hh:68
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:975
void free()
Free the index lists.
Definition: remoteindices.hh:1424
A Tuple of objects.
Definition: tuples.hh:294
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:460
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:491
#define DUNE_THROW(E, m)
Definition: exceptions.hh:244
Provides a map between global and local indices.
Dune namespace.
Definition: alignment.hh:14
Implements an utility class that provides collective communication methods for sequential programs.
Implements an utility class that provides MPI's collective communication methods.
Classes describing a distributed indexset.
V::value_type IndexedType
The type we get at each index with operator[].
Definition: communicator.hh:140
Attribute set for overlapping schwarz.
Definition: owneroverlapcopy.hh:58
gather/scatter callback for communcation
Definition: owneroverlapcopy.hh:203
Categories for the solvers.
Definition: solvercategory.hh:19
Category
Definition: solvercategory.hh:20
@ overlapping
Category for ovelapping solvers.
Definition: solvercategory.hh:26
Fallback implementation of the std::tuple class.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 12, 23:30, 2024)