3#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH
4#define DUNE_ISTL_NOVLPSCHWARZ_HH
13#include <dune/common/timer.hh>
58 template<
class M,
class X,
class Y,
class C>
73 typedef typename C::PIS
PIS;
74 typedef typename C::RI
RI;
75 typedef typename RI::RemoteIndexList
RIL;
80 typedef std::multimap<int,int>
MM;
81 typedef std::multimap<int,std::pair<int,RILIterator> >
RIMap;
97 : _A_(A), communication(
com), buildcomm(
true)
105 communication.addOwnerCopyToOwnerCopy(
y,
y);
116 communication.addOwnerCopyToOwnerCopy(
y,
y);
129 const PIS& pis=communication.indexSet();
130 const RI& ri = communication.remoteIndices();
135 if (buildcomm ==
true) {
138 if (mask.size()!=
static_cast<typename std::vector<double>::size_type
>(x.size())) {
139 mask.resize(x.size());
140 for (
typename std::vector<double>::size_type i=0; i<mask.size(); i++)
142 for (
typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
144 mask[i->local().local()] = 0;
146 mask[i->local().local()] = 2;
149 for (MM::iterator
iter = bordercontribution.begin();
150 iter != bordercontribution.end(); ++
iter)
151 bordercontribution.erase(
iter);
152 std::map<int,int> owner;
157 for (
RowIterator i = _A_.begin(); i != _A_.end(); ++i)
158 if (mask[i.index()] == 0)
163 if (
rindex->localIndexPair().local().local() == i.index()) {
165 (std::make_pair(i.index(),
168 owner.insert(std::make_pair(i.index(),
remote->first));
173 for (
RowIterator i = _A_.begin(); i != _A_.end(); ++i) {
174 if (mask[i.index()] == 0) {
175 std::map<int,int>::iterator
it = owner.find(i.index());
177 std::pair<RIMapit, RIMapit>
foundiit =
rimap.equal_range(i.index());
178 for (
ColIterator j = _A_[i.index()].begin(); j != _A_[i.index()].end(); ++j) {
179 if (mask[j.index()] == 0) {
182 std::pair<RIMapit, RIMapit>
foundjit =
rimap.equal_range(j.index());
187 ||
foundj->second.first < communication.communicator().rank()) {
202 bordercontribution.insert(std::pair<int,int>(i.index(),j.index()));
211 for (
RowIterator i = _A_.begin(); i != _A_.end(); ++i) {
212 if (mask[i.index()] == 0) {
214 for (
ColIterator j = _A_[i.index()].begin(); j != _A_[i.index()].end(); ++j) {
215 if (mask[j.index()] == 1)
216 (*j).usmv(alpha,x[j.index()],
y[i.index()]);
217 else if (mask[j.index()] == 0) {
218 std::pair<MM::iterator, MM::iterator>
itp =
219 bordercontribution.equal_range(i.index());
220 for (MM::iterator
it =
itp.first;
it !=
itp.second; ++
it)
221 if ((*it).second == (
int)j.index())
222 (*j).usmv(alpha,x[j.index()],
y[i.index()]);
226 else if (mask[i.index()] == 1) {
227 for (
ColIterator j = _A_[i.index()].begin(); j != _A_[i.index()].end(); ++j)
228 if (mask[j.index()] != 2)
229 (*j).usmv(alpha,x[j.index()],
y[i.index()]);
237 mutable bool buildcomm;
238 mutable std::vector<double> mask;
239 mutable std::multimap<int,int> bordercontribution;
253 template<
class X,
class C>
293 return communication.norm(x);
300 communication.copyOwnerToAll(x,x);
307 template<
class X,
class C>
340 template<
class C,
class P>
366 : preconditioner(
prec), communication(c)
376 preconditioner.pre(x,b);
389 preconditioner.apply(v,
d);
390 communication.addOwnerCopyToOwnerCopy(v,v);
400 preconditioner.post(x);
Implementation of the BCRSMatrix class.
This file implements a vector space as a tensor product of a given vector space. The number of compon...
Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
Some generic functions for pretty printing vectors and matrices.
Define general, extensible interface for operators. The available implementation wraps a matrix.
Classes providing communication interfaces for overlapping Schwarz methods.
Define general preconditioner interface.
Define base class for scalar product and norm.
Implementations of the inverse operator interface.
Definition basearray.hh:19
Statistics about compression achieved in implicit mode.
Definition bcrsmatrix.hh:81
A nonoverlapping operator with communication object.
Definition novlpschwarz.hh:60
C::PIS PIS
Definition novlpschwarz.hh:73
C communication_type
The type of the communication object.
Definition novlpschwarz.hh:71
std::multimap< int, std::pair< int, RILIterator > > RIMap
Definition novlpschwarz.hh:81
C::RI RI
Definition novlpschwarz.hh:74
void novlp_op_apply(const X &x, Y &y, field_type alpha) const
Definition novlpschwarz.hh:126
M::ConstColIterator ColIterator
Definition novlpschwarz.hh:78
virtual void apply(const X &x, Y &y) const
apply operator to x:
Definition novlpschwarz.hh:101
X domain_type
The type of the domain.
Definition novlpschwarz.hh:65
RIMap::iterator RIMapit
Definition novlpschwarz.hh:82
virtual const matrix_type & getmat() const
get matrix via *
Definition novlpschwarz.hh:121
RIL::const_iterator RILIterator
Definition novlpschwarz.hh:77
std::multimap< int, int > MM
Definition novlpschwarz.hh:80
Y range_type
The type of the range.
Definition novlpschwarz.hh:67
M matrix_type
The type of the matrix we operate on.
Definition novlpschwarz.hh:63
M::ConstRowIterator RowIterator
Definition novlpschwarz.hh:79
virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
apply operator to x, scale and add:
Definition novlpschwarz.hh:109
RI::RemoteIndexList RIL
Definition novlpschwarz.hh:75
@ category
The solver category.
Definition novlpschwarz.hh:86
X::field_type field_type
The field type of the range.
Definition novlpschwarz.hh:69
NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
constructor: just store a reference to a matrix.
Definition novlpschwarz.hh:96
RI::const_iterator RIIterator
Definition novlpschwarz.hh:76
Nonoverlapping Scalar Product with communication object.
Definition novlpschwarz.hh:255
FieldTraits< field_type >::real_type real_type
The real-type of the range.
Definition novlpschwarz.hh:262
X domain_type
The type of the domain.
Definition novlpschwarz.hh:258
@ category
Definition novlpschwarz.hh:267
X::field_type field_type
The type of the range.
Definition novlpschwarz.hh:260
C communication_type
The type of the communication object.
Definition novlpschwarz.hh:264
virtual real_type norm(const X &x)
Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.
Definition novlpschwarz.hh:291
void make_consistent(X &x) const
make additive vector consistent
Definition novlpschwarz.hh:298
virtual field_type dot(const X &x, const X &y)
Dot product of two vectors. It is assumed that the vectors are consistent on the interior+border part...
Definition novlpschwarz.hh:281
NonoverlappingSchwarzScalarProduct(const communication_type &com)
Constructor.
Definition novlpschwarz.hh:273
NonoverlappingSchwarzScalarProduct< X, C > ScalarProduct
The type of the scalar product for the nonoverlapping case.
Definition novlpschwarz.hh:311
C communication_type
The type of the communication object to use.
Definition novlpschwarz.hh:313
Traits class for generically constructing non default constructable types.
Definition construction.hh:38
Nonoverlapping parallel preconditioner.
Definition novlpschwarz.hh:342
virtual void apply(domain_type &v, const range_type &d)
Apply the preconditioner.
Definition novlpschwarz.hh:384
P::range_type range_type
The range type of the preconditioner.
Definition novlpschwarz.hh:348
virtual void post(domain_type &x)
Clean up.
Definition novlpschwarz.hh:398
C communication_type
The type of the communication object.
Definition novlpschwarz.hh:350
NonoverlappingBlockPreconditioner(P &prec, const communication_type &c)
Constructor.
Definition novlpschwarz.hh:365
virtual void pre(domain_type &x, range_type &b)
Prepare the preconditioner.
Definition novlpschwarz.hh:374
@ category
The category the preconditioner is part of.
Definition novlpschwarz.hh:355
P::domain_type domain_type
The domain type of the preconditioner.
Definition novlpschwarz.hh:346
A linear operator exporting itself in matrix form.
Definition operators.hh:94
@ owner
Definition owneroverlapcopy.hh:60
@ copy
Definition owneroverlapcopy.hh:60
@ overlap
Definition owneroverlapcopy.hh:60
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:26
Base class for scalar product and norm computation.
Definition scalarproducts.hh:44
Choose the approriate scalar product for a solver category.
Definition scalarproducts.hh:77
@ solverCategory
The solver category.
Definition scalarproducts.hh:83
Categories for the solvers.
Definition solvercategory.hh:18
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:23