1#ifndef DUNE_FEM_OPERATOR_LINEAR_ISTLADAPTER_HH
2#define DUNE_FEM_OPERATOR_LINEAR_ISTLADAPTER_HH
5#include <dune/common/version.hh>
7#include <dune/istl/operators.hh>
21 template<
class Operator >
22 class ISTLLinearOperatorAdapter
23 :
public Dune::LinearOperator< typename Operator::DomainFunctionType::DofStorageType, typename Operator::RangeFunctionType::DofStorageType >
25 typedef ISTLLinearOperatorAdapter< Operator > ThisType;
26 typedef Dune::LinearOperator< typename Operator::DomainFunctionType::DofStorageType, typename Operator::RangeFunctionType::DofStorageType > BaseType;
28 typedef typename Operator::DomainFunctionType DomainFunctionType;
29 typedef typename Operator::RangeFunctionType RangeFunctionType;
32#if ! DUNE_VERSION_NEWER(DUNE_ISTL, 2, 6)
33 enum {category=SolverCategory::sequential};
36 typedef Operator OperatorType;
38 typedef typename DomainFunctionType::DiscreteFunctionSpaceType DomainFunctionSpaceType;
39 typedef typename RangeFunctionType::DiscreteFunctionSpaceType RangeFunctionSpaceType;
41 typedef typename BaseType::domain_type domain_type;
42 typedef typename BaseType::range_type range_type;
43 typedef typename BaseType::field_type field_type;
45 ISTLLinearOperatorAdapter (
const OperatorType &op,
46 const DomainFunctionSpaceType &domainSpace,
47 const RangeFunctionSpaceType &rangeSpace )
49 domainSpace_( domainSpace ),
50 rangeSpace_( rangeSpace )
53 virtual void apply (
const domain_type &x, range_type &y )
const override
55 const DomainFunctionType fx(
"ISTLLinearOperatorAdapter::apply::x", domainSpace_, x );
56 RangeFunctionType fy(
"ISTLLinearOperatorAdapter::apply::y", rangeSpace_, y );
60 virtual void applyscaleadd ( field_type alpha,
const domain_type &x, range_type &y )
const override
62 const DomainFunctionType fx(
"ISTLLinearOperatorAdapter::applyscaleadd::x", domainSpace_, x );
63 RangeFunctionType fy(
"ISTLLinearOperatorAdapter::applyscaleadd::y", rangeSpace_ );
65 y.axpy( alpha, fy.blockVector() );
68#if DUNE_VERSION_NEWER(DUNE_ISTL, 2, 6)
69 SolverCategory::Category category ()
const override {
return SolverCategory::sequential; }
73 const OperatorType &op_;
74 const DomainFunctionSpaceType &domainSpace_;
75 const RangeFunctionSpaceType &rangeSpace_;
78 template<
class Operator >
79 class ISTLMatrixFreeOperatorAdapter :
public ISTLLinearOperatorAdapter< Operator >
81 typedef ISTLMatrixFreeOperatorAdapter< Operator > ThisType;
82 typedef ISTLLinearOperatorAdapter< Operator > BaseType;
84 typedef typename Operator::DomainFunctionType DomainFunctionType;
85 typedef typename Operator::RangeFunctionType RangeFunctionType;
88#if ! DUNE_VERSION_NEWER(DUNE_ISTL, 2, 6)
89 enum {category=SolverCategory::sequential};
92 typedef Operator OperatorType;
94 typedef typename DomainFunctionType::DiscreteFunctionSpaceType DomainFunctionSpaceType;
95 typedef typename RangeFunctionType::DiscreteFunctionSpaceType RangeFunctionSpaceType;
98 struct IsISTLBlockVectorDiscreteFunction
100 static const bool value = false ;
103 template <
class Space,
class Block>
104 struct IsISTLBlockVectorDiscreteFunction< ISTLBlockVectorDiscreteFunction< Space, Block > >
106 static const bool value = true ;
110 static_assert( IsISTLBlockVectorDiscreteFunction< DomainFunctionType > :: value,
111 "ISTLMatrixFreeOperatorAdapter only works with ISTLBlockVectorDiscreteFunction" );
112 static_assert( IsISTLBlockVectorDiscreteFunction< RangeFunctionType > :: value,
113 "ISTLMatrixFreeOperatorAdapter only works with ISTLBlockVectorDiscreteFunction" );
115 typedef typename BaseType::domain_type domain_type;
116 typedef typename BaseType::range_type range_type;
117 typedef typename BaseType::field_type field_type;
119 typedef Fem::ParallelScalarProduct< RangeFunctionType > ParallelScalarProductType;
120 typedef Fem::IdentityPreconditionerWrapper< domain_type, range_type > PreconditionAdapterType;
123 ISTLMatrixFreeOperatorAdapter (
const OperatorType &op,
124 const DomainFunctionSpaceType &domainSpace,
125 const RangeFunctionSpaceType &rangeSpace )
126 : BaseType( op, domainSpace, rangeSpace ),
132 ISTLMatrixFreeOperatorAdapter (
const ISTLMatrixFreeOperatorAdapter& other )
134 scp_( other.rangeSpace_ ),
139 PreconditionAdapterType& preconditionAdapter() {
return preconditioner_; }
141 const PreconditionAdapterType& preconditionAdapter()
const {
return preconditioner_; }
143 virtual double residuum(
const range_type& rhs, domain_type& x)
const
145 range_type tmp( rhs );
151 return scp_.norm(tmp);
154#if DUNE_VERSION_NEWER(DUNE_ISTL, 2, 6)
155 SolverCategory::Category category ()
const override {
return SolverCategory::sequential; }
159 ParallelScalarProductType& scp()
const {
return scp_; }
162 double averageCommTime ()
const {
return 0; }
165 mutable ParallelScalarProductType scp_;
166 PreconditionAdapterType preconditioner_;
Definition: bindguard.hh:11