0001
0002
0003
0004
0005
0006 function xi = solvePrecond_noSaddle(L, P, rhs, xL, xR, opts, G )
0007
0008
0009
0010
0011 if isa(L,'parameterdependent')
0012 if opts.tediousPrec
0013 n = xL.size;
0014 P_Ls = repmat( {sparse(n(2),n(2))}, 1, xR.order );
0015 P_Ls{1} = L.A{1};
0016 [P_rhs, B1, B3] = precond_laplace_overlapJacobi( P_Ls, rhs, xL, xR, G );
0017 else
0018 P_rhs = precond_rankOne( L, rhs, xL, xR );
0019 end
0020 else
0021
0022 P_Ls = repmat( {P.L0}, 1, xR.order );
0023
0024
0025 [P_rhs, B1, B3] = precond_laplace_overlapJacobi( P_Ls, rhs, xL, xR, G );
0026 end
0027
0028
0029 function y = fun_A(x)
0030
0031 x_tangent = fill_with_vectorized( dummy, x );
0032 x_ttemps = tangent_to_TTeMPS( x_tangent );
0033 x_ttemps = apply(L, x_ttemps);
0034 y_tangent = TTeMPS_tangent_orth( xL, xR, x_ttemps );
0035 y = vectorize_tangent( y_tangent );
0036 end
0037
0038 function y = fun_P(x)
0039 x_tangent = fill_with_vectorized( dummy, x );
0040 if isa(L,'parameterdependent') && ~opts.tediousPrec
0041 eta = precond_rankOne( L, x_tangent, xL, xR );
0042 else
0043 eta = precond_laplace_overlapJacobi( P_Ls, x_tangent, xL, xR, G, B1, B3 );
0044 end
0045 y = vectorize_tangent( eta );
0046 end
0047
0048 if opts.precond_maxit > 1
0049 dummy = rhs;
0050
0051 tol = opts.precond_tol;
0052 maxit = opts.precond_maxit-1;
0053
0054 [xi_vec,flag,relres,iter] = pcg(@fun_A, vectorize_tangent(rhs), tol, maxit, @fun_P, [], vectorize_tangent(P_rhs) );
0055 disp(['pcg converged after ' num2str(iter) 'iterations']);
0056 xi = fill_with_vectorized( dummy, xi_vec );
0057 else
0058 xi = P_rhs;
0059 end
0060
0061 end