1 #ifndef DUNE_FEM_ISTLMATRIXADAPTER_HH 2 #define DUNE_FEM_ISTLMATRIXADAPTER_HH 6 #include <dune/common/timer.hh> 8 #include <dune/istl/operators.hh> 22 template <
class MatrixImp>
23 class LagrangeParallelMatrixAdapter
24 :
public AssembledLinearOperator< MatrixImp,
25 typename MatrixImp :: RowBlockVectorType,
26 typename MatrixImp :: ColBlockVectorType>
28 typedef LagrangeParallelMatrixAdapter< MatrixImp > ThisType;
30 typedef MatrixImp MatrixType;
31 typedef Fem::PreconditionerWrapper<MatrixType> PreconditionAdapterType;
33 typedef typename MatrixType :: RowDiscreteFunctionType RowDiscreteFunctionType;
34 typedef typename MatrixType :: ColDiscreteFunctionType ColumnDiscreteFunctionType;
36 typedef typename RowDiscreteFunctionType :: DiscreteFunctionSpaceType RowSpaceType;
38 typedef typename ColumnDiscreteFunctionType :: DiscreteFunctionSpaceType ColSpaceType;
39 typedef Fem::ParallelScalarProduct<ColumnDiscreteFunctionType> ParallelScalarProductType;
41 typedef typename RowDiscreteFunctionType :: DofStorageType X;
42 typedef typename ColumnDiscreteFunctionType :: DofStorageType Y;
45 typedef MatrixType matrix_type;
46 typedef X domain_type;
48 typedef typename X::field_type field_type;
51 enum { category=SolverCategory::sequential };
55 LagrangeParallelMatrixAdapter (
const LagrangeParallelMatrixAdapter &org )
56 : matrix_( org.matrix_ ),
57 rowSpace_( org.rowSpace_ ),
58 colSpace_( org.colSpace_ ),
60 preconditioner_( org.preconditioner_ ),
61 averageCommTime_( org.averageCommTime_ )
66 LagrangeParallelMatrixAdapter ( MatrixType &matrix,
67 const RowSpaceType &rowSpace,
68 const ColSpaceType &colSpace,
69 const PreconditionAdapterType& precon )
71 rowSpace_( rowSpace ),
72 colSpace_( colSpace ),
74 preconditioner_( precon ),
79 double averageCommTime()
const 81 return averageCommTime_ ;
85 PreconditionAdapterType &preconditionAdapter()
87 return preconditioner_;
90 const PreconditionAdapterType &preconditionAdapter()
const 92 return preconditioner_;
96 ParallelScalarProductType &scp()
102 virtual void apply (
const X &x, Y &y )
const 109 virtual void applyscaleadd ( field_type alpha,
const X &x, Y &y)
const 111 if( rowSpace_.grid().comm().size() <= 1 )
113 matrix_.usmv(alpha,x,y);
120 y.axpy( alpha, tmp );
124 virtual double residuum(
const Y& rhs, X& x)
const 132 return scp_.norm(tmp);
136 virtual const MatrixType& getmat ()
const 142 void communicate( Y &y )
const 144 if( rowSpace_.grid().comm().size() <= 1 )
147 Dune::Timer commTime;
148 ColumnDiscreteFunctionType tmp(
"LagrangeParallelMatrixAdapter::communicate", colSpace_, y );
149 colSpace_.communicate( tmp );
150 averageCommTime_ += commTime.elapsed();
154 const RowSpaceType &rowSpace_;
155 const ColSpaceType &colSpace_;
156 mutable ParallelScalarProductType scp_;
157 PreconditionAdapterType preconditioner_;
158 mutable double averageCommTime_;
161 template <
class MatrixImp>
162 class DGParallelMatrixAdapter
163 :
public AssembledLinearOperator< MatrixImp,
164 typename MatrixImp :: RowBlockVectorType,
165 typename MatrixImp :: ColBlockVectorType>
167 typedef DGParallelMatrixAdapter< MatrixImp > ThisType ;
169 typedef MatrixImp MatrixType;
170 typedef Fem::PreconditionerWrapper<MatrixType> PreconditionAdapterType;
172 typedef typename MatrixType :: RowDiscreteFunctionType RowDiscreteFunctionType;
173 typedef typename MatrixType :: ColDiscreteFunctionType ColumnDiscreteFunctionType;
175 typedef typename RowDiscreteFunctionType :: DiscreteFunctionSpaceType RowSpaceType;
177 typedef typename ColumnDiscreteFunctionType :: DiscreteFunctionSpaceType ColSpaceType;
178 typedef Fem::ParallelScalarProduct<ColumnDiscreteFunctionType> ParallelScalarProductType;
180 typedef typename RowDiscreteFunctionType :: DofStorageType X;
181 typedef typename ColumnDiscreteFunctionType :: DofStorageType Y;
184 typedef MatrixType matrix_type;
185 typedef X domain_type;
186 typedef Y range_type;
187 typedef typename X::field_type field_type;
190 enum { category=SolverCategory::sequential };
194 const RowSpaceType& rowSpace_;
195 const ColSpaceType& colSpace_;
197 ParallelScalarProductType scp_;
199 PreconditionAdapterType preconditioner_;
200 mutable double averageCommTime_;
204 DGParallelMatrixAdapter (
const DGParallelMatrixAdapter& org)
205 : matrix_(org.matrix_)
206 , rowSpace_(org.rowSpace_)
207 , colSpace_(org.colSpace_)
209 , preconditioner_(org.preconditioner_)
210 , averageCommTime_( org.averageCommTime_ )
214 DGParallelMatrixAdapter (MatrixType& A,
215 const RowSpaceType& rowSpace,
216 const ColSpaceType& colSpace,
217 const PreconditionAdapterType& precon )
219 , rowSpace_(rowSpace)
220 , colSpace_(colSpace)
222 , preconditioner_( precon )
223 , averageCommTime_( 0.0 )
227 double averageCommTime()
const 229 return averageCommTime_ ;
233 PreconditionAdapterType& preconditionAdapter() {
return preconditioner_; }
234 const PreconditionAdapterType& preconditionAdapter()
const {
return preconditioner_; }
237 ParallelScalarProductType& scp() {
return scp_; }
240 virtual void apply (
const X& x, Y& y)
const 249 scp_.deleteNonInterior( y );
253 virtual void applyscaleadd (field_type alpha,
const X& x, Y& y)
const 259 matrix_.usmv(alpha,x,y);
262 scp_.deleteNonInterior( y );
265 virtual double residuum(
const Y& rhs, X& x)
const 270 typedef typename ParallelScalarProductType :: SlaveDofsType SlaveDofsType;
271 const SlaveDofsType& slaveDofs = scp_.slaveDofs();
273 typedef typename Y :: block_type LittleBlockVectorType;
274 LittleBlockVectorType tmp;
279 const int slaveSize = slaveDofs.size();
280 for(
int slave = 0; slave<slaveSize; ++slave)
282 const int nextSlave = slaveDofs[slave];
283 for(; i<nextSlave; ++i)
287 typedef typename MatrixType :: row_type row_type;
289 const row_type& row = matrix_[i];
291 typedef typename MatrixType :: ConstColIterator ConstColIterator;
292 ConstColIterator endj = row.end();
293 for (ConstColIterator j = row.begin(); j!=endj; ++j)
295 (*j).umv(x[j.index()], tmp);
302 res += tmp.two_norm2();
307 res = rowSpace_.grid().comm().sum( res );
313 virtual const MatrixType& getmat ()
const 318 void communicate(
const X& x)
const 320 if( rowSpace_.grid().comm().size() <= 1 )
return ;
322 Dune::Timer commTime;
325 RowDiscreteFunctionType tmp (
"DGParallelMatrixAdapter::communicate",
329 rowSpace_.communicate( tmp );
332 averageCommTime_ += commTime.elapsed();
336 template <
class MatrixImp,
class Space>
337 struct ISTLParallelMatrixAdapter;
339 template<
class MatrixImp,
340 class FunctionSpace,
class GridPart,
int polOrder,
template<
class >
class Storage>
341 struct ISTLParallelMatrixAdapter< MatrixImp, LagrangeDiscreteFunctionSpace< FunctionSpace,GridPart,polOrder,Storage> >
343 typedef LagrangeParallelMatrixAdapter<MatrixImp> Type;
346 template<
class MatrixImp,
347 class FunctionSpace,
class GridPart,
int polOrder,
template<
class >
class Storage>
348 struct ISTLParallelMatrixAdapter< MatrixImp, PAdaptiveLagrangeSpace< FunctionSpace,GridPart,polOrder,Storage> >
350 typedef LagrangeParallelMatrixAdapter<MatrixImp> Type;
352 template<
class MatrixImp,
353 class FunctionSpace,
class GridPart,
int polOrder,
template<
class >
class Storage>
354 struct ISTLParallelMatrixAdapter< MatrixImp, DiscontinuousGalerkinSpace< FunctionSpace,GridPart,polOrder,Storage> >
356 typedef DGParallelMatrixAdapter<MatrixImp> Type ;
358 template<
class MatrixImp,
359 class FunctionSpace,
class GridPart,
int polOrder,
template<
class >
class Storage>
360 struct ISTLParallelMatrixAdapter< MatrixImp, LagrangeDiscontinuousGalerkinSpace< FunctionSpace,GridPart,polOrder,Storage> >
362 typedef DGParallelMatrixAdapter<MatrixImp> Type ;
364 template<
class MatrixImp,
365 class FunctionSpace,
class GridPart,
int polOrder,
template<
class >
class Storage>
366 struct ISTLParallelMatrixAdapter< MatrixImp, LegendreDiscontinuousGalerkinSpace< FunctionSpace,GridPart,polOrder,Storage> >
368 typedef DGParallelMatrixAdapter<MatrixImp> Type ;
370 template<
class MatrixImp,
371 class FunctionSpace,
class GridPart,
int polOrder,
template<
class >
class Storage>
372 struct ISTLParallelMatrixAdapter< MatrixImp, HierarchicLegendreDiscontinuousGalerkinSpace< FunctionSpace,GridPart,polOrder,Storage> >
374 typedef DGParallelMatrixAdapter<MatrixImp> Type ;
376 template<
class MatrixImp,
377 class FunctionSpace,
class GridPart,
int polOrder,
template<
class >
class Storage>
378 struct ISTLParallelMatrixAdapter< MatrixImp, PAdaptiveDGSpace< FunctionSpace,GridPart,polOrder,Storage> >
380 typedef DGParallelMatrixAdapter<MatrixImp> Type ;
383 template<
class MatrixImp,
class Space1,
class Space2>
384 struct ISTLParallelMatrixAdapter<MatrixImp, CombinedDiscreteFunctionSpace<Space1, Space2> >
386 typedef LagrangeParallelMatrixAdapter<MatrixImp> Type;
388 template<
class MatrixImp,
class ... DiscreteFunctionSpaces >
389 struct ISTLParallelMatrixAdapter<MatrixImp, TupleDiscreteFunctionSpace< DiscreteFunctionSpaces ... > >
391 typedef LagrangeParallelMatrixAdapter<MatrixImp> Type;
398 #endif // #if HAVE_DUNE_ISTL 400 #endif // #ifndef DUNE_FEM_ISTLMATRIXADAPTER_HH
static double sqrt(const Double &v)
Definition: double.hh:870
Definition: coordinate.hh:4