{"action":"created","issue":{"url":"https://api.github.com/repos/JuliaLang/IterativeSolvers.jl/issues/71","repository_url":"https://api.github.com/repos/JuliaLang/IterativeSolvers.jl","labels_url":"https://api.github.com/repos/JuliaLang/IterativeSolvers.jl/issues/71/labels{/name}","comments_url":"https://api.github.com/repos/JuliaLang/IterativeSolvers.jl/issues/71/comments","events_url":"https://api.github.com/repos/JuliaLang/IterativeSolvers.jl/issues/71/events","html_url":"https://github.com/JuliaLang/IterativeSolvers.jl/issues/71","id":152061267,"number":71,"title":"Preconditioner: P^{-1} and not P","user":{"login":"zimoun","id":6526949,"avatar_url":"https://avatars.githubusercontent.com/u/6526949?v=3","gravatar_id":"","url":"https://api.github.com/users/zimoun","html_url":"https://github.com/zimoun","followers_url":"https://api.github.com/users/zimoun/followers","following_url":"https://api.github.com/users/zimoun/following{/other_user}","gists_url":"https://api.github.com/users/zimoun/gists{/gist_id}","starred_url":"https://api.github.com/users/zimoun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zimoun/subscriptions","organizations_url":"https://api.github.com/users/zimoun/orgs","repos_url":"https://api.github.com/users/zimoun/repos","events_url":"https://api.github.com/users/zimoun/events{/privacy}","received_events_url":"https://api.github.com/users/zimoun/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":1,"created_at":"2016-05-01T00:41:38Z","updated_at":"2016-05-01T00:52:12Z","closed_at":null,"body":"in some applications (e.g., Boundary Element Method / BEM), it is possible to directly build an approximation of the inverse, and then, `Pl\\(A*(Pr\\x))` e.g. l.81 in `gmres.jl`. does not make sense.\r\n\r\nFor example, the classical operator preconditioning of the integral single layer operator `V` is the integral double layer `W`, i.e, the preconditioned system reads `W*V x = W*b`. And both are dense operators. Therefore, it is not possible to use this version of `gmres`, since it should provide `inv(W)` which is clearly not accessible.\r\n\r\nIt seems more coherent to give a `Linear Operator` as preconditioner such that `Ml*(A*(Mr*x))` approximates the identity. And not `Pl\\(A*(Pr\\x))`. Otherwise it is confusing.\r\n\r\nThe user should be free to evaluate as he wants the result of `P\\`, and he should only provide this, not `P`. The use of `\\` is restricting.\r\n"},"comment":{"url":"https://api.github.com/repos/JuliaLang/IterativeSolvers.jl/issues/comments/216005697","html_url":"https://github.com/JuliaLang/IterativeSolvers.jl/issues/71#issuecomment-216005697","issue_url":"https://api.github.com/repos/JuliaLang/IterativeSolvers.jl/issues/71","id":216005697,"user":{"login":"andreasnoack","id":505001,"avatar_url":"https://avatars.githubusercontent.com/u/505001?v=3","gravatar_id":"","url":"https://api.github.com/users/andreasnoack","html_url":"https://github.com/andreasnoack","followers_url":"https://api.github.com/users/andreasnoack/followers","following_url":"https://api.github.com/users/andreasnoack/following{/other_user}","gists_url":"https://api.github.com/users/andreasnoack/gists{/gist_id}","starred_url":"https://api.github.com/users/andreasnoack/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andreasnoack/subscriptions","organizations_url":"https://api.github.com/users/andreasnoack/orgs","repos_url":"https://api.github.com/users/andreasnoack/repos","events_url":"https://api.github.com/users/andreasnoack/events{/privacy}","received_events_url":"https://api.github.com/users/andreasnoack/received_events","type":"User","site_admin":false},"created_at":"2016-05-01T00:52:12Z","updated_at":"2016-05-01T00:52:12Z","body":"You are free to define `\\` as you'd like for your preconditioner so you are not restricted. E.g. something like\r\n```\r\nimmutable InvIntegralDouble\r\n    invMat::Matrix{Float64}\r\nend\r\nimport Base: *,\\\r\n(*)(A::InvIntegralDouble, x::Vector) = error(\"you don't wanna do this\")\r\n(\\)(A::InvIntegralDouble, x::Vector) = A.invMat*x\r\n```"}}