{"action":"created","issue":{"url":"https://api.github.com/repos/trilinos/Trilinos/issues/673","repository_url":"https://api.github.com/repos/trilinos/Trilinos","labels_url":"https://api.github.com/repos/trilinos/Trilinos/issues/673/labels{/name}","comments_url":"https://api.github.com/repos/trilinos/Trilinos/issues/673/comments","events_url":"https://api.github.com/repos/trilinos/Trilinos/issues/673/events","html_url":"https://github.com/trilinos/Trilinos/issues/673","id":180166665,"number":673,"title":"Tpetra::Map::replaceCommWithSubset: Optimize for MPI_COMM_SELF case","user":{"login":"mhoemmen","id":926747,"avatar_url":"https://avatars.githubusercontent.com/u/926747?v=3","gravatar_id":"","url":"https://api.github.com/users/mhoemmen","html_url":"https://github.com/mhoemmen","followers_url":"https://api.github.com/users/mhoemmen/followers","following_url":"https://api.github.com/users/mhoemmen/following{/other_user}","gists_url":"https://api.github.com/users/mhoemmen/gists{/gist_id}","starred_url":"https://api.github.com/users/mhoemmen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhoemmen/subscriptions","organizations_url":"https://api.github.com/users/mhoemmen/orgs","repos_url":"https://api.github.com/users/mhoemmen/repos","events_url":"https://api.github.com/users/mhoemmen/events{/privacy}","received_events_url":"https://api.github.com/users/mhoemmen/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/trilinos/Trilinos/labels/in%20review","name":"in review","color":"e6e6e6"},{"url":"https://api.github.com/repos/trilinos/Trilinos/labels/task","name":"task","color":"e11d21"},{"url":"https://api.github.com/repos/trilinos/Trilinos/labels/Tpetra","name":"Tpetra","color":"5319e7"}],"state":"open","locked":false,"assignee":{"login":"mhoemmen","id":926747,"avatar_url":"https://avatars.githubusercontent.com/u/926747?v=3","gravatar_id":"","url":"https://api.github.com/users/mhoemmen","html_url":"https://github.com/mhoemmen","followers_url":"https://api.github.com/users/mhoemmen/followers","following_url":"https://api.github.com/users/mhoemmen/following{/other_user}","gists_url":"https://api.github.com/users/mhoemmen/gists{/gist_id}","starred_url":"https://api.github.com/users/mhoemmen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhoemmen/subscriptions","organizations_url":"https://api.github.com/users/mhoemmen/orgs","repos_url":"https://api.github.com/users/mhoemmen/repos","events_url":"https://api.github.com/users/mhoemmen/events{/privacy}","received_events_url":"https://api.github.com/users/mhoemmen/received_events","type":"User","site_admin":false},"assignees":[{"login":"mhoemmen","id":926747,"avatar_url":"https://avatars.githubusercontent.com/u/926747?v=3","gravatar_id":"","url":"https://api.github.com/users/mhoemmen","html_url":"https://github.com/mhoemmen","followers_url":"https://api.github.com/users/mhoemmen/followers","following_url":"https://api.github.com/users/mhoemmen/following{/other_user}","gists_url":"https://api.github.com/users/mhoemmen/gists{/gist_id}","starred_url":"https://api.github.com/users/mhoemmen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhoemmen/subscriptions","organizations_url":"https://api.github.com/users/mhoemmen/orgs","repos_url":"https://api.github.com/users/mhoemmen/repos","events_url":"https://api.github.com/users/mhoemmen/events{/privacy}","received_events_url":"https://api.github.com/users/mhoemmen/received_events","type":"User","site_admin":false}],"milestone":null,"comments":4,"created_at":"2016-09-29T21:22:46Z","updated_at":"2016-10-10T19:37:30Z","closed_at":null,"body":"@trilinos/tpetra @ambrad \r\n\r\nThis relates to our discussion in #558.  To summarize: Ifpack2::AdditiveSchwarz is supposed to take responsibility for the initial Import. That Import results in an input (Multi)Vector for the subdomain solver. The subdomain solver thus should not have to do another Import. This implies that the subdomain solver's column Map should be the same as its domain Map.\r\n\r\nThis introduces a minor problem, namely that domain and range Maps are supposed to be one to one (nonoverlapping), yet the subdomain solver's \"domain Map,\" according to the criterion above, _must_ be overlapping over the original matrix's communicator.  The right way to fix this would be to restrict the subdomain solver's domain Map, so that its communicator only has one process. This correctly reflects that the subdomain solver only works on a single process. (A full generalization of AdditiveSchwarz that allows multiprocess subdomain solvers, would restrict the domain Map to the subdomain's subcommunicator.) As a result, after AdditiveSchwarz does its Import, what really should happen is that the resulting (Multi)Vector gets restricted to the subdomain's subcommunicator (which is MPI_COMM_SELF or its equivalent, in this case). This is a no-communication operation and _should_ not require copying any data.\r\n\r\nTpetra's way to implement that restriction, is to call Tpetra::Map's replaceCommWithSubset method.  It takes the subcommunicator as input, and returns a new Map with that subcommunicator as its communicator.  replaceCommWithSubset has collective semantics over the _subcommunicator_ (its input).  That's good in this case, because we're giving it `MPI_COMM_SELF`.  However, the implementation currently builds a new Map (e.g., new FixedHashTable), whether or not it needs to.  In particular, if the input subcomm is `MPI_COMM_SELF`, the output Map should just be able to get all its data directly from the input Map, without any error checking.  For example, if the input Map is noncontiguous, the output Map could just use its FixedHashTable directly."},"comment":{"url":"https://api.github.com/repos/trilinos/Trilinos/issues/comments/252725980","html_url":"https://github.com/trilinos/Trilinos/issues/673#issuecomment-252725980","issue_url":"https://api.github.com/repos/trilinos/Trilinos/issues/673","id":252725980,"user":{"login":"mhoemmen","id":926747,"avatar_url":"https://avatars.githubusercontent.com/u/926747?v=3","gravatar_id":"","url":"https://api.github.com/users/mhoemmen","html_url":"https://github.com/mhoemmen","followers_url":"https://api.github.com/users/mhoemmen/followers","following_url":"https://api.github.com/users/mhoemmen/following{/other_user}","gists_url":"https://api.github.com/users/mhoemmen/gists{/gist_id}","starred_url":"https://api.github.com/users/mhoemmen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhoemmen/subscriptions","organizations_url":"https://api.github.com/users/mhoemmen/orgs","repos_url":"https://api.github.com/users/mhoemmen/repos","events_url":"https://api.github.com/users/mhoemmen/events{/privacy}","received_events_url":"https://api.github.com/users/mhoemmen/received_events","type":"User","site_admin":false},"created_at":"2016-10-10T19:37:30Z","updated_at":"2016-10-10T19:37:30Z","body":"Got a fix in place that optimizes for the `comm->getSize() == 1` case."}}
{"actor":{"display_login":"mhoemmen"}}