45 typename std::enable_if_t<!Dune::IsNumber<Matrix>::value>* sfinae =
nullptr )
47 for(
auto i = A.
begin(), iend = A.
end(); i != iend; ++i )
50 auto &&B_i = B[ i.index() ];
51 const auto ikend = B_i.
end();
52 for(
auto j = A_i.begin(), jend = A_i.end(); j != jend; ++j )
55 auto &&CT_j = CT[ j.index() ];
56 const auto jkend = CT_j.
end();
57 for(
auto ik = B_i.begin(), jk = CT_j.begin(); (ik != ikend) && (jk != jkend); )
59 if( ik.index() == jk.index() )
64 else if( ik.index() < jk.index() )
90 for(
auto i = A.
begin(), iend = A.
end(); i != iend; ++i )
94 auto ij = A_i.begin();
95 for( ; ij.index() < i.index(); ++ij )
98 auto &&A_j = A[ ij.index() ];
102 auto ik = A_i.
begin();
103 auto jk = A_j.begin();
104 while( (ik != ij) && (jk.index() < ij.index()) )
106 if( ik.index() == jk.index() )
111 else if( ik.index() < jk.index() )
118 if( ij.index() != i.index() )
119 DUNE_THROW(
ISTLError,
"diagonal entry missing" );
123 for(
auto ik = A_i.begin(); ik != ij; ++ik )
126 const auto &A_k = A[ ik.index() ];
129 Impl::asMatrix(A_ik).rightmultiply( Impl::asMatrix(*A_k.find( ik.index() )) );
134 Impl::asMatrix(A_ii).invert();
136 catch(
const Dune::FMatrixError &e )
138 DUNE_THROW(
MatrixBlockError,
"ILDL failed to invert matrix block A[" << i.index() <<
"][" << ij.index() <<
"]" << e.what(); th__ex.r = i.index(); th__ex.c = ij.index() );
152 for(
auto i = A.
begin(), iend = A.
end(); i != iend; ++i )
154 const auto &A_i = *i;
155 v[ i.index() ] = d[ i.index() ];
156 for(
auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
158 auto&& vi = Impl::asVector( v[ i.index() ] );
159 Impl::asMatrix(*ij).mmv(Impl::asVector( v[ ij.index() ] ), vi);
164 if( isLowerTriangular )
168 for(
auto i = A.
begin(), iend = A.
end(); i != iend; ++i )
170 const auto &A_i = *i;
171 const auto ii = A_i.beforeEnd();
172 assert( ii.index() == i.index() );
179 auto rhsValue = v[ i.index() ];
180 auto&& rhs = Impl::asVector(rhsValue);
181 auto&& vi = Impl::asVector( v[ i.index() ] );
182 Impl::asMatrix(*ii).mv(rhs, vi);
189 for(
auto i = A.
begin(), iend = A.
end(); i != iend; ++i )
191 const auto &A_i = *i;
192 const auto ii = A_i.find( i.index() );
193 assert( ii.index() == i.index() );
200 auto rhsValue = v[ i.index() ];
201 auto&& rhs = Impl::asVector(rhsValue);
202 auto&& vi = Impl::asVector( v[ i.index() ] );
203 Impl::asMatrix(*ii).mv(rhs, vi);
211 const auto &A_i = *i;
212 for(
auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
214 auto&& vij = Impl::asVector( v[ ij.index() ] );
215 Impl::asMatrix(*ij).mmtv(Impl::asVector( v[ i.index() ] ), vij);
static void bildl_subtractBCT(const FieldMatrix< K, m, n > &B, const FieldMatrix< K, m, n > &CT, FieldMatrix< K, m, n > &A)
Definition ildl.hh:24