MILU.hpp
Go to the documentation of this file.
1/*
2 Copyright 2015, 2022 Dr. Blatt - HPC-Simulation-Software & Services
3 Copyright 2015 Statoil AS
4
5 This file is part of the Open Porous Media project (OPM).
6
7 OPM is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 OPM is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with OPM. If not, see <http://www.gnu.org/licenses/>.
19*/
20#ifndef OPM_MILU_HEADER_INCLUDED
21#define OPM_MILU_HEADER_INCLUDED
22
23#include <cmath>
24#include <cstddef>
25#include <functional>
26#include <string>
27#include <vector>
28
29
30
31namespace Opm
32{
33
34enum class MILU_VARIANT{
36 ILU = 0,
38 MILU_1 = 1,
40 MILU_2 = 2,
42 MILU_3 = 3,
44 MILU_4 = 4
45};
46
47MILU_VARIANT convertString2Milu(const std::string& milu);
48
49
50namespace detail
51{
52
53template <typename T>
54T identityFunctor(const T&);
55
56template <typename T>
57T oneFunctor(const T&);
58
59template <typename T>
60T signFunctor(const T&);
61
62template <typename T>
64
65template <typename T>
66T absFunctor(const T&);
67
68
70{
71 virtual std::size_t operator[](std::size_t i) const = 0;
72 virtual ~Reorderer() {}
73};
74
75struct NoReorderer : public Reorderer
76{
77 virtual std::size_t operator[](std::size_t i) const
78 {
79 return i;
80 }
81};
82
83struct RealReorderer : public Reorderer
84{
85 RealReorderer(const std::vector<std::size_t>& ordering)
86 : ordering_(&ordering)
87 {}
88 virtual std::size_t operator[](std::size_t i) const
89 {
90 return (*ordering_)[i];
91 }
92 const std::vector<std::size_t>* ordering_;
93};
94
95
96template<class M>
97using FieldFunct = std::function<typename M::field_type(const typename M::field_type&)>;
98
99template <typename M>
100void milu0_decomposition(M& A, FieldFunct<M> absFunctor = signFunctor<typename M::field_type>,
101 FieldFunct<M> signFunctor = oneFunctor<typename M::field_type>,
102 std::vector<typename M::block_type>* diagonal = nullptr);
103
104template<class M>
105void milu0_decomposition(M& A, std::vector<typename M::block_type>* diagonal)
106{
107 milu0_decomposition(A, identityFunctor<typename M::field_type>, oneFunctor<typename M::field_type>, diagonal);
108}
109
110
111template<class M>
112void milun_decomposition(const M& A, int n, MILU_VARIANT milu, M& ILU,
113 Reorderer& ordering, Reorderer& inverseOrdering);
114
115} // end namespace details
116
117} // end namespace Opm
118
119#endif
T identityFunctor(const T &)
T oneFunctor(const T &)
std::function< typename M::field_type(const typename M::field_type &)> FieldFunct
Definition: MILU.hpp:97
void milu0_decomposition(M &A, FieldFunct< M > absFunctor=signFunctor< typename M::field_type >, FieldFunct< M > signFunctor=oneFunctor< typename M::field_type >, std::vector< typename M::block_type > *diagonal=nullptr)
void milun_decomposition(const M &A, int n, MILU_VARIANT milu, M &ILU, Reorderer &ordering, Reorderer &inverseOrdering)
T signFunctor(const T &)
T absFunctor(const T &)
T isPositiveFunctor(const T &)
Definition: BlackoilPhases.hpp:27
MILU_VARIANT
Definition: MILU.hpp:34
@ MILU_1
sum(dropped entries)
@ MILU_2
sum(dropped entries)
@ MILU_3
sum(|dropped entries|)
@ MILU_4
sum(dropped entries)
@ ILU
Do not perform modified ILU.
MILU_VARIANT convertString2Milu(const std::string &milu)
Definition: MILU.hpp:76
virtual std::size_t operator[](std::size_t i) const
Definition: MILU.hpp:77
Definition: MILU.hpp:84
RealReorderer(const std::vector< std::size_t > &ordering)
Definition: MILU.hpp:85
const std::vector< std::size_t > * ordering_
Definition: MILU.hpp:92
virtual std::size_t operator[](std::size_t i) const
Definition: MILU.hpp:88
Definition: MILU.hpp:70
virtual std::size_t operator[](std::size_t i) const =0
virtual ~Reorderer()
Definition: MILU.hpp:72