{"action":"created","comment":{"url":"https://api.github.com/repos/dealii/dealii/pulls/comments/46833025","id":46833025,"diff_hunk":"@@ -769,6 +769,259 @@ null_operator(const LinearOperator<Range, Domain> &op)\n }\n \n \n+/**\n+ * @relates LinearOperator\n+ *\n+ * Returns a LinearOperator that performs the operations\n+ * associated with the Schur complement. There are two additional\n+ * helper functions, preprocess() and postprocess(), that are likely\n+ * necessary to be used in order to perform any useful tasks in linear\n+ * algebra with this operator.\n+ *\n+ * We construct the definition of the Schur operator in the following way:\n+ *\n+ * Consider a general system of linear equations that can be\n+ * decomposed into two major sets of equations:\n+ * @f{eqnarray*}\n+  \\mathbf{K}\\mathbf{d} = \\mathbf{h}\n+  \\quad \\Rightarrow\\quad\n+  \\left(\\begin{array}{cc}\n+    A & B \\\\ C & D\n+  \\end{array}\\right)\n+  \\left(\\begin{array}{cc}\n+    x \\\\ y\n+  \\end{array}\\right)\n+  =\n+  \\left(\\begin{array}{cc}\n+    f \\\\ g\n+  \\end{array}\\right),\n+ * @f}\n+ * where \\f$ A,B,C,D \\f$  represent general subblocks of the matrix\n+ * \\f$ \\mathbf{K} \\f$ and, similarly, general subvectors of\n+ * \\f$ \\mathbf{d},\\mathbf{h} \\f$ are given by \\f$ x,y,f,g \\f$ .\n+ *\n+ * This is equivalent to the following two statements:\n+ * @f{eqnarray*}\n+     (1) \\quad Ax + By &=& f \\\\\n+     (2) \\quad Cx + Dy &=& g \\quad .\n+ * @f}\n+ *\n+ * Assuming that \\f$ A,D \\f$ are both square and invertible, we could\n+ * then perform one of two possible substitutions.\n+ * @f{eqnarray*}\n+     (3) \\quad x &=& A^{-1}(f - By) \\quad \\textnormal{from} \\quad (1) \\\\\n+     (4) \\quad y &=& D^{-1}(g - Cx) \\quad \\textnormal{from} \\quad (4) .\n+ * @f}\n+ *\n+ * For the purpose of the current implementation, we choose to\n+ * substitute (3) into (2):\n+ * @f{eqnarray*}\n+     (5) \\quad C \\: A^{-1}(f - By) + Dy &=& g \\\\\n+     (6) \\quad -C \\: A^{-1} \\: By + Dy &=& g - C \\: A^{-1} \\: f\n+   @f}\n+ * which leads to the result\n+ * @f[\n+     (7) \\quad Sy = g - C \\: A^{-1} f\n+   @f]\n+ * with \\f$ S = (D - C\\: A^{-1} \\:B) \\f$ being the Schur complement.\n+ * Note that for this choice of \\f$ S \\f$, submatrix \\f$ D \\f$\n+ * need not be invertible and may thus be the null matrix.\n+ *\n+ * So for any arbitrary vector \\f$ a \\f$, the Schur complement\n+ * performs the following operation:\n+ * @f[\n+     (8) \\quad Sa = (D - C \\: A^{-1} \\: B)a\n+   @f]\n+ *\n+ * A typical set of steps needed the solve a linear system (1),(2)\n+ * would be:\n+ * 1. Define the inverse matrix @p A_inv (using inverse_operator()).\n+ * 2. Define the Schur operator \\f$ S \\f$ (using schur_operator()).\n+ * 3. Define iterative inverse matrix \\f$ S^{-1} \\f$ such that (8)\n+ *    holds.\n+ *    It is necessary to use a solver with a preconditioner\n+ *    to compute the approximate inverse operation of \\f$ S \\f$ since\n+ *    we never compute \\f$ S \\f$ directly, but rather the result of\n+ *    its operation.\n+ *    To achieve this, one may again use the inverse_operator() in\n+ *    conjunction with the Schur operator that we've just\n+ *    constructed.\n+ * 4. Perform pre-processing step on the RHS of (7) using\n+ *    preprocess():\n+ *    @f[\n+        g' = g - C \\: A^{-1} \\: f\n+      @f]\n+ * 5. Solve for \\f$ y \\f$ in (7):\n+ *    @f[\n+        y =  S^{-1} g'\n+      @f]\n+ * 6. Perform the post-processing step from (3) using\n+ *    postprocess():\n+ *    @f[\n+        x =  A^{-1} (f - By)\n+      @f]\n+ *    Note that, at the same time, this function will reverse\n+ *    the condensation operation performed in step (4) so that\n+ *    the original RHS remains:\n+ *    @f[\n+        g = g' + C \\: A^{-1} \\: f\n+      @f]\n+ *\n+ * @note The functionality provided by solve_system() encapulates","path":"include/deal.II/lac/linear_operator.h","position":102,"original_position":102,"commit_id":"5768da732e7dfacd8890714eec8161986ebdcafd","original_commit_id":"add1018369c36987d181b9c10f57ff66d8133cd3","user":{"login":"jppelteret","id":10460610,"avatar_url":"https://avatars.githubusercontent.com/u/10460610?v=3","gravatar_id":"","url":"https://api.github.com/users/jppelteret","html_url":"https://github.com/jppelteret","followers_url":"https://api.github.com/users/jppelteret/followers","following_url":"https://api.github.com/users/jppelteret/following{/other_user}","gists_url":"https://api.github.com/users/jppelteret/gists{/gist_id}","starred_url":"https://api.github.com/users/jppelteret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jppelteret/subscriptions","organizations_url":"https://api.github.com/users/jppelteret/orgs","repos_url":"https://api.github.com/users/jppelteret/repos","events_url":"https://api.github.com/users/jppelteret/events{/privacy}","received_events_url":"https://api.github.com/users/jppelteret/received_events","type":"User","site_admin":false},"body":"Yes it does, both here and in the changelog. Maybe its got something to do with the Doxygen's group or section wrappers? They're currently inside the namespace but whenever I put them outside then the functions inside the namespace get put into a general \"function\" category instead of the \"Schur complement\" category. I'm not too familiar with this part of Doxygen so I don't know what else I can try to fix it.","created_at":"2015-12-07T15:30:10Z","updated_at":"2015-12-07T15:30:10Z","html_url":"https://github.com/dealii/dealii/pull/1956#discussion_r46833025","pull_request_url":"https://api.github.com/repos/dealii/dealii/pulls/1956","_links":{"self":{"href":"https://api.github.com/repos/dealii/dealii/pulls/comments/46833025"},"html":{"href":"https://github.com/dealii/dealii/pull/1956#discussion_r46833025"},"pull_request":{"href":"https://api.github.com/repos/dealii/dealii/pulls/1956"}}},"pull_request":{"url":"https://api.github.com/repos/dealii/dealii/pulls/1956","id":52846140,"html_url":"https://github.com/dealii/dealii/pull/1956","diff_url":"https://github.com/dealii/dealii/pull/1956.diff","patch_url":"https://github.com/dealii/dealii/pull/1956.patch","issue_url":"https://api.github.com/repos/dealii/dealii/issues/1956","number":1956,"state":"open","locked":false,"title":"[WIP] Schur operator","user":{"login":"jppelteret","id":10460610,"avatar_url":"https://avatars.githubusercontent.com/u/10460610?v=3","gravatar_id":"","url":"https://api.github.com/users/jppelteret","html_url":"https://github.com/jppelteret","followers_url":"https://api.github.com/users/jppelteret/followers","following_url":"https://api.github.com/users/jppelteret/following{/other_user}","gists_url":"https://api.github.com/users/jppelteret/gists{/gist_id}","starred_url":"https://api.github.com/users/jppelteret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jppelteret/subscriptions","organizations_url":"https://api.github.com/users/jppelteret/orgs","repos_url":"https://api.github.com/users/jppelteret/repos","events_url":"https://api.github.com/users/jppelteret/events{/privacy}","received_events_url":"https://api.github.com/users/jppelteret/received_events","type":"User","site_admin":false},"body":"Implementation of a Schur operator and auxillary functions. Addresses #1439 .\r\n","created_at":"2015-12-07T13:47:06Z","updated_at":"2015-12-07T15:30:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ae3505cfc0a768d2d789d29e378cec5bdde5ae34","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dealii/dealii/pulls/1956/commits","review_comments_url":"https://api.github.com/repos/dealii/dealii/pulls/1956/comments","review_comment_url":"https://api.github.com/repos/dealii/dealii/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dealii/dealii/issues/1956/comments","statuses_url":"https://api.github.com/repos/dealii/dealii/statuses/5768da732e7dfacd8890714eec8161986ebdcafd","head":{"label":"jppelteret:schur_operator","ref":"schur_operator","sha":"5768da732e7dfacd8890714eec8161986ebdcafd","user":{"login":"jppelteret","id":10460610,"avatar_url":"https://avatars.githubusercontent.com/u/10460610?v=3","gravatar_id":"","url":"https://api.github.com/users/jppelteret","html_url":"https://github.com/jppelteret","followers_url":"https://api.github.com/users/jppelteret/followers","following_url":"https://api.github.com/users/jppelteret/following{/other_user}","gists_url":"https://api.github.com/users/jppelteret/gists{/gist_id}","starred_url":"https://api.github.com/users/jppelteret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jppelteret/subscriptions","organizations_url":"https://api.github.com/users/jppelteret/orgs","repos_url":"https://api.github.com/users/jppelteret/repos","events_url":"https://api.github.com/users/jppelteret/events{/privacy}","received_events_url":"https://api.github.com/users/jppelteret/received_events","type":"User","site_admin":false},"repo":{"id":40106037,"name":"dealii","full_name":"jppelteret/dealii","owner":{"login":"jppelteret","id":10460610,"avatar_url":"https://avatars.githubusercontent.com/u/10460610?v=3","gravatar_id":"","url":"https://api.github.com/users/jppelteret","html_url":"https://github.com/jppelteret","followers_url":"https://api.github.com/users/jppelteret/followers","following_url":"https://api.github.com/users/jppelteret/following{/other_user}","gists_url":"https://api.github.com/users/jppelteret/gists{/gist_id}","starred_url":"https://api.github.com/users/jppelteret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jppelteret/subscriptions","organizations_url":"https://api.github.com/users/jppelteret/orgs","repos_url":"https://api.github.com/users/jppelteret/repos","events_url":"https://api.github.com/users/jppelteret/events{/privacy}","received_events_url":"https://api.github.com/users/jppelteret/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jppelteret/dealii","description":"The development repository for the deal.II finite element library.","fork":true,"url":"https://api.github.com/repos/jppelteret/dealii","forks_url":"https://api.github.com/repos/jppelteret/dealii/forks","keys_url":"https://api.github.com/repos/jppelteret/dealii/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jppelteret/dealii/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jppelteret/dealii/teams","hooks_url":"https://api.github.com/repos/jppelteret/dealii/hooks","issue_events_url":"https://api.github.com/repos/jppelteret/dealii/issues/events{/number}","events_url":"https://api.github.com/repos/jppelteret/dealii/events","assignees_url":"https://api.github.com/repos/jppelteret/dealii/assignees{/user}","branches_url":"https://api.github.com/repos/jppelteret/dealii/branches{/branch}","tags_url":"https://api.github.com/repos/jppelteret/dealii/tags","blobs_url":"https://api.github.com/repos/jppelteret/dealii/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jppelteret/dealii/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jppelteret/dealii/git/refs{/sha}","trees_url":"https://api.github.com/repos/jppelteret/dealii/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jppelteret/dealii/statuses/{sha}","languages_url":"https://api.github.com/repos/jppelteret/dealii/languages","stargazers_url":"https://api.github.com/repos/jppelteret/dealii/stargazers","contributors_url":"https://api.github.com/repos/jppelteret/dealii/contributors","subscribers_url":"https://api.github.com/repos/jppelteret/dealii/subscribers","subscription_url":"https://api.github.com/repos/jppelteret/dealii/subscription","commits_url":"https://api.github.com/repos/jppelteret/dealii/commits{/sha}","git_commits_url":"https://api.github.com/repos/jppelteret/dealii/git/commits{/sha}","comments_url":"https://api.github.com/repos/jppelteret/dealii/comments{/number}","issue_comment_url":"https://api.github.com/repos/jppelteret/dealii/issues/comments{/number}","contents_url":"https://api.github.com/repos/jppelteret/dealii/contents/{+path}","compare_url":"https://api.github.com/repos/jppelteret/dealii/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jppelteret/dealii/merges","archive_url":"https://api.github.com/repos/jppelteret/dealii/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jppelteret/dealii/downloads","issues_url":"https://api.github.com/repos/jppelteret/dealii/issues{/number}","pulls_url":"https://api.github.com/repos/jppelteret/dealii/pulls{/number}","milestones_url":"https://api.github.com/repos/jppelteret/dealii/milestones{/number}","notifications_url":"https://api.github.com/repos/jppelteret/dealii/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jppelteret/dealii/labels{/name}","releases_url":"https://api.github.com/repos/jppelteret/dealii/releases{/id}","created_at":"2015-08-03T05:08:52Z","updated_at":"2015-08-03T05:09:58Z","pushed_at":"2015-12-07T15:07:58Z","git_url":"git://github.com/jppelteret/dealii.git","ssh_url":"git@github.com:jppelteret/dealii.git","clone_url":"https://github.com/jppelteret/dealii.git","svn_url":"https://github.com/jppelteret/dealii","homepage":"http://www.dealii.org/","size":128526,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dealii:master","ref":"master","sha":"69fe72487bf9b61be21f92e304413e79ed1d0b88","user":{"login":"dealii","id":7506070,"avatar_url":"https://avatars.githubusercontent.com/u/7506070?v=3","gravatar_id":"","url":"https://api.github.com/users/dealii","html_url":"https://github.com/dealii","followers_url":"https://api.github.com/users/dealii/followers","following_url":"https://api.github.com/users/dealii/following{/other_user}","gists_url":"https://api.github.com/users/dealii/gists{/gist_id}","starred_url":"https://api.github.com/users/dealii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dealii/subscriptions","organizations_url":"https://api.github.com/users/dealii/orgs","repos_url":"https://api.github.com/users/dealii/repos","events_url":"https://api.github.com/users/dealii/events{/privacy}","received_events_url":"https://api.github.com/users/dealii/received_events","type":"Organization","site_admin":false},"repo":{"id":21943980,"name":"dealii","full_name":"dealii/dealii","owner":{"login":"dealii","id":7506070,"avatar_url":"https://avatars.githubusercontent.com/u/7506070?v=3","gravatar_id":"","url":"https://api.github.com/users/dealii","html_url":"https://github.com/dealii","followers_url":"https://api.github.com/users/dealii/followers","following_url":"https://api.github.com/users/dealii/following{/other_user}","gists_url":"https://api.github.com/users/dealii/gists{/gist_id}","starred_url":"https://api.github.com/users/dealii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dealii/subscriptions","organizations_url":"https://api.github.com/users/dealii/orgs","repos_url":"https://api.github.com/users/dealii/repos","events_url":"https://api.github.com/users/dealii/events{/privacy}","received_events_url":"https://api.github.com/users/dealii/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dealii/dealii","description":"The development repository for the deal.II finite element library.","fork":false,"url":"https://api.github.com/repos/dealii/dealii","forks_url":"https://api.github.com/repos/dealii/dealii/forks","keys_url":"https://api.github.com/repos/dealii/dealii/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dealii/dealii/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dealii/dealii/teams","hooks_url":"https://api.github.com/repos/dealii/dealii/hooks","issue_events_url":"https://api.github.com/repos/dealii/dealii/issues/events{/number}","events_url":"https://api.github.com/repos/dealii/dealii/events","assignees_url":"https://api.github.com/repos/dealii/dealii/assignees{/user}","branches_url":"https://api.github.com/repos/dealii/dealii/branches{/branch}","tags_url":"https://api.github.com/repos/dealii/dealii/tags","blobs_url":"https://api.github.com/repos/dealii/dealii/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dealii/dealii/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dealii/dealii/git/refs{/sha}","trees_url":"https://api.github.com/repos/dealii/dealii/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dealii/dealii/statuses/{sha}","languages_url":"https://api.github.com/repos/dealii/dealii/languages","stargazers_url":"https://api.github.com/repos/dealii/dealii/stargazers","contributors_url":"https://api.github.com/repos/dealii/dealii/contributors","subscribers_url":"https://api.github.com/repos/dealii/dealii/subscribers","subscription_url":"https://api.github.com/repos/dealii/dealii/subscription","commits_url":"https://api.github.com/repos/dealii/dealii/commits{/sha}","git_commits_url":"https://api.github.com/repos/dealii/dealii/git/commits{/sha}","comments_url":"https://api.github.com/repos/dealii/dealii/comments{/number}","issue_comment_url":"https://api.github.com/repos/dealii/dealii/issues/comments{/number}","contents_url":"https://api.github.com/repos/dealii/dealii/contents/{+path}","compare_url":"https://api.github.com/repos/dealii/dealii/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dealii/dealii/merges","archive_url":"https://api.github.com/repos/dealii/dealii/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dealii/dealii/downloads","issues_url":"https://api.github.com/repos/dealii/dealii/issues{/number}","pulls_url":"https://api.github.com/repos/dealii/dealii/pulls{/number}","milestones_url":"https://api.github.com/repos/dealii/dealii/milestones{/number}","notifications_url":"https://api.github.com/repos/dealii/dealii/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dealii/dealii/labels{/name}","releases_url":"https://api.github.com/repos/dealii/dealii/releases{/id}","created_at":"2014-07-17T14:00:26Z","updated_at":"2015-12-05T15:47:21Z","pushed_at":"2015-12-07T15:07:59Z","git_url":"git://github.com/dealii/dealii.git","ssh_url":"git@github.com:dealii/dealii.git","clone_url":"https://github.com/dealii/dealii.git","svn_url":"https://github.com/dealii/dealii","homepage":"http://www.dealii.org/","size":136698,"stargazers_count":110,"watchers_count":110,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":133,"mirror_url":null,"open_issues_count":146,"forks":133,"open_issues":146,"watchers":110,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dealii/dealii/pulls/1956"},"html":{"href":"https://github.com/dealii/dealii/pull/1956"},"issue":{"href":"https://api.github.com/repos/dealii/dealii/issues/1956"},"comments":{"href":"https://api.github.com/repos/dealii/dealii/issues/1956/comments"},"review_comments":{"href":"https://api.github.com/repos/dealii/dealii/pulls/1956/comments"},"review_comment":{"href":"https://api.github.com/repos/dealii/dealii/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dealii/dealii/pulls/1956/commits"},"statuses":{"href":"https://api.github.com/repos/dealii/dealii/statuses/5768da732e7dfacd8890714eec8161986ebdcafd"}}}}