20 #ifndef OPM_PARALLELOVERLAPPINGILU0_HEADER_INCLUDED 21 #define OPM_PARALLELOVERLAPPINGILU0_HEADER_INCLUDED 22 #include <opm/common/TimingMacros.hpp> 23 #include <opm/simulators/linalg/MILU.hpp> 24 #include <opm/simulators/linalg/PreconditionerWithUpdate.hpp> 25 #include <dune/istl/paamg/smoother.hh> 29 #include <type_traits> 36 template<
class Matrix,
class Domain,
class Range,
class ParallelInfo>
41 :
public Dune::Amg::DefaultSmootherArgs<F>
76 template<
class M,
class X,
class Y,
class C>
77 struct SmootherTraits<
Opm::ParallelOverlappingILU0<M,X,Y,C> >
88 template<
class Matrix,
class Domain,
class Range,
class ParallelInfo>
89 struct ConstructionTraits<
Opm::ParallelOverlappingILU0<Matrix,Domain,Range,ParallelInfo> >
92 using Arguments = DefaultParallelConstructionArgs<T,ParallelInfo>;
94 using ParallelOverlappingILU0Pointer = std::shared_ptr<T>;
96 static inline ParallelOverlappingILU0Pointer construct(Arguments& args)
98 return ParallelOverlappingILU0Pointer(
99 new T(args.getMatrix(),
101 args.getArgs().getN(),
102 args.getArgs().relaxationFactor,
103 args.getArgs().getMilu()) );
128 template<
class Matrix,
class Domain,
class Range,
class ParallelInfoT>
129 class ParallelOverlappingILU0
132 using ParallelInfo = ParallelInfoT;
144 using block_type =
typename matrix_type::block_type;
145 using size_type =
typename matrix_type::size_type;
147 virtual bool hasPerfectUpdate()
const override {
154 CRS() : nRows_( 0 ) {}
156 size_type rows()
const {
return nRows_; }
158 size_type nonZeros()
const 160 assert( rows_[ rows() ] != size_type(-1) );
161 return rows_[ rows() ];
164 void resize(
const size_type nRows )
166 if( nRows_ != nRows )
169 rows_.resize( nRows_+1, size_type(-1) );
173 void reserveAdditional(
const size_type nonZeros )
175 const size_type needed = values_.size() + nonZeros ;
176 if( values_.capacity() < needed )
178 const size_type estimate = needed * 1.1;
179 values_.reserve( estimate );
180 cols_.reserve( estimate );
184 void push_back(
const block_type& value,
const size_type index )
186 values_.push_back( value );
187 cols_.push_back( index );
198 std::vector<size_type> rows_;
199 std::vector<block_type> values_;
200 std::vector<size_type> cols_;
205 Dune::SolverCategory::Category category()
const override;
223 bool reorder_sphere =
true);
238 const ParallelInfo& comm,
const int n,
const field_type w,
240 bool reorder_sphere =
true);
256 bool redblack =
false,
257 bool reorder_sphere =
true);
275 bool reorder_sphere =
true);
292 const ParallelInfo& comm,
294 size_type interiorSize,
bool redblack =
false,
295 bool reorder_sphere =
true);
302 void pre (Domain&, Range&)
override 310 void apply (Domain& v,
const Range& d)
override;
313 void copyOwnerToAll( V& v )
const;
323 void update()
override;
332 void reorderBack(
const Range& reorderedV, Range& v);
338 std::vector< block_type > inv_;
346 const ParallelInfo* comm_;
349 const bool relaxation_;
350 size_type interiorSize_;
A two-step version of an overlapping Schwarz preconditioner using one step ILU0 as.
Definition: ParallelOverlappingILU0.hpp:37
MILU_VARIANT
Definition: MILU.hpp:34
typename std::remove_const< Matrix >::type matrix_type
The matrix type the preconditioner is for.
Definition: ParallelOverlappingILU0.hpp:136
const field_type w_
The relaxation factor to use.
Definition: ParallelOverlappingILU0.hpp:348
Do not perform modified ILU.
Range & reorderD(const Range &d)
Reorder D if needed and return a reference to it.
Definition: ParallelOverlappingILU0_impl.hpp:566
Range range_type
The range type of the preconditioner.
Definition: ParallelOverlappingILU0.hpp:140
Definition: fvbaseprimaryvariables.hh:161
Definition: ParallelOverlappingILU0.hpp:40
std::vector< std::size_t > ordering_
the reordering of the unknowns
Definition: ParallelOverlappingILU0.hpp:340
void apply(Domain &v, const Range &d) override
Apply the preconditoner.
Definition: ParallelOverlappingILU0_impl.hpp:323
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Domain domain_type
The domain type of the preconditioner.
Definition: ParallelOverlappingILU0.hpp:138
std::unique_ptr< Matrix > ILU_
The ILU0 decomposition of the matrix.
Definition: ParallelOverlappingILU0.hpp:335
Interface class adding the update() method to the preconditioner interface.
Definition: PreconditionerWithUpdate.hpp:33
typename Domain::field_type field_type
The field type of the preconditioner.
Definition: ParallelOverlappingILU0.hpp:142
Domain reorderedV_
The reordered left hand side.
Definition: ParallelOverlappingILU0.hpp:344
void post(Range &) override
Clean up.
Definition: ParallelOverlappingILU0.hpp:320
Definition: ParallelOverlappingILU0.hpp:152
Range reorderedD_
The reordered right hand side.
Definition: ParallelOverlappingILU0.hpp:342
Domain & reorderV(Domain &v)
Reorder V if needed and return a reference to it.
Definition: ParallelOverlappingILU0_impl.hpp:590
void pre(Domain &, Range &) override
Prepare the preconditioner.
Definition: ParallelOverlappingILU0.hpp:302
ParallelOverlappingILU0(const Matrix &A, const int n, const field_type w, MILU_VARIANT milu, bool redblack=false, bool reorder_sphere=true)
Constructor.
Definition: ParallelOverlappingILU0_impl.hpp:233