Dune Core Modules (2.7.0)

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 
21 #include <dune/common/enumset.hh>
22 
23 #if HAVE_MPI
28 #endif
29 
30 #include "solvercategory.hh"
31 #include "istlexception.hh"
34 
35 template<int dim, template<class,class> class Comm>
36 void testRedistributed(int s);
37 
38 
39 namespace 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 
104  void addLocalIndex (const IndexTripel& x)
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
180  typedef typename IndexInfoFromGrid<GlobalIdType,LocalIdType>::RemoteIndexTripel RemoteIndexTripel;
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.")
299  getSolverCategory () const {
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 
472  const ParallelIndexSet& indexSet() const
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:379
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
L LocalIdType
The type of the local index.
Definition: owneroverlapcopy.hh:82
const std::set< IndexTripel > & localIndices() const
Get the set of indices local to the process.
Definition: owneroverlapcopy.hh:131
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
const std::set< RemoteIndexTripel > & remoteIndices() const
Get the set of remote indices.
Definition: owneroverlapcopy.hh:140
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
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition: owneroverlapcopy.hh:472
RemoteIndices & remoteIndices()
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:500
ParallelIndexSet & indexSet()
Get the underlying parallel index set.
Definition: owneroverlapcopy.hh:490
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
FieldTraits< typename T1::field_type >::real_type norm(const T1 &x) const
Compute the global Euclidean norm of a vector.
Definition: owneroverlapcopy.hh:436
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
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
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:481
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition: owneroverlapcopy.hh:323
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.80.0 (May 12, 22:29, 2024)