{"action":"created","comment":{"url":"https://api.github.com/repos/OPM/ewoms/pulls/comments/94322866","pull_request_review_id":14850067,"id":94322866,"diff_hunk":"@@ -0,0 +1,357 @@\n+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-\n+// vi: set et ts=4 sw=4 sts=4:\n+/*\n+  This file is part of the Open Porous Media project (OPM).\n+\n+  OPM is free software: you can redistribute it and/or modify\n+  it under the terms of the GNU General Public License as published by\n+  the Free Software Foundation, either version 2 of the License, or\n+  (at your option) any later version.\n+\n+  OPM is distributed in the hope that it will be useful,\n+  but WITHOUT ANY WARRANTY; without even the implied warranty of\n+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+  GNU General Public License for more details.\n+\n+  You should have received a copy of the GNU General Public License\n+  along with OPM.  If not, see <http://www.gnu.org/licenses/>.\n+\n+  Consult the COPYING file in the top-level source directory of this\n+  module for the precise wording of the license and the list of\n+  copyright holders.\n+*/\n+/*!\n+ * \\file\n+ * \\copydoc Ewoms::Linear::BiCGStabSolver\n+ */\n+#ifndef EWOMS_BICG_STAB_SOLVER_HH\n+#define EWOMS_BICG_STAB_SOLVER_HH\n+\n+#include \"convergencecriterion.hh\"\n+#include \"residreductioncriterion.hh\"\n+#include \"linearsolverreport.hh\"\n+\n+#include <ewoms/common/timer.hh>\n+#include <ewoms/common/timerguard.hh>\n+\n+#include <opm/common/ErrorMacros.hpp>\n+#include <opm/common/Exceptions.hpp>\n+\n+#include <memory>\n+\n+namespace Ewoms {\n+namespace Linear {\n+/*!\n+ * \\brief Implements a preconditioned stabilized BiCG linear solver.\n+ *\n+ * This solves a linear system of equations Ax = b, where the matrix A is sparse and may\n+ * be unsymmetric.\n+ *\n+ * See https://en.wikipedia.org/wiki/Biconjugate_gradient_stabilized_method, (article\n+ * date: December 19, 2016)\n+ */\n+template <class LinearOperator, class Vector, class Preconditioner>\n+class BiCGStabSolver\n+{\n+    typedef Ewoms::Linear::ConvergenceCriterion<Vector> ConvergenceCriterion;\n+    typedef typename LinearOperator::field_type Scalar;\n+\n+public:\n+    BiCGStabSolver(std::shared_ptr<Preconditioner> preconditioner,\n+                   std::shared_ptr<ConvergenceCriterion> convergenceCriterion,\n+                   std::shared_ptr<Dune::ScalarProduct<Vector> > scalarProduct)\n+        : preconditioner_(preconditioner)\n+        , convergenceCriterion_(convergenceCriterion)\n+        , scalarProduct_(scalarProduct)\n+    {\n+        A_ = nullptr;\n+        b_ = nullptr;\n+\n+        maxIterations_ = 1000;\n+    }\n+\n+    /*!\n+     * \\brief Set the maximum number of iterations before we give up without achieving\n+     *        convergence.\n+     */\n+    void setMaxIterations(unsigned value)\n+    { maxIterations_ = value; }\n+\n+    /*!\n+     * \\brief Return the maximum number of iterations before we give up without achieving\n+     *        convergence.\n+     */\n+    unsigned maxIterations() const\n+    { return maxIterations_; }\n+\n+    /*!\n+     * \\brief Set the verbosity level of the linear solver\n+     *\n+     * The levels correspont to those used by the dune-istl solvers:\n+     *\n+     * - 0: no output\n+     * - 1: summary output at the end of the solution proceedure (if no exception was\n+     *      thrown)\n+     * - 2: detailed output after each iteration\n+     */\n+    void setVerbosity(unsigned value)\n+    { verbosity_ = value; }\n+\n+    /*!\n+     * \\brief Return the verbosity level of the linear solver.\n+     */\n+    unsigned verbosity() const\n+    { return verbosity_; }\n+\n+    /*!\n+     * \\brief Set the matrix \"A\" of the linear system.\n+     */\n+    void setLinearOperator(const LinearOperator* A)\n+    { A_ = A; }\n+\n+    /*!\n+     * \\brief Set the right hand side \"b\" of the linear system.\n+     */\n+    void setRhs(const Vector* b)\n+    { b_ = b; }\n+\n+    /*!\n+     * \\brief Run the stabilized BiCG solver and store the result into the \"x\" vector.\n+     */\n+    bool apply(Vector& x)\n+    {\n+        // epsilon used for detecting breakdowns\n+        static constexpr Scalar breakdownEps = std::numeric_limits<Scalar>::min()*1e10;\n+\n+        // start the stop watch for the solution proceedure, but make sure that it is\n+        // turned off regardless of how we leave the stadium. (i.e., that the timer gets\n+        // stopped in case exceptions are thrown as well as if the method returns\n+        // regularly.)\n+        report_.reset();\n+        Ewoms::TimerGuard reportTimerGuard(report_.timer());\n+        report_.timer().start();\n+\n+        // preconditioned stabilized biconjugate gradient method\n+        //\n+        // See https://en.wikipedia.org/wiki/Biconjugate_gradient_stabilized_method,\n+        // (article date: December 19, 2016)\n+\n+        // set the initial solution to the zero vector\n+        x = 0.0;\n+\n+        // prepare the preconditioner. to allow some optimizations, we assume that the\n+        // preconditioner does not change the initial solution x if the initial solution\n+        // is a zero vector.\n+        Vector r = *b_;\n+        preconditioner_->pre(x, r);\n+\n+#ifndef NDEBUG\n+        // ensure that the preconditioner does not change the initial solution. since\n+        // this is a debugging check, we don't care if it does not work properly in\n+        // parallel. (because this goes wrong, it should be considered to be a bug in the\n+        // code anyway.)\n+        for (unsigned i = 0; i < x.size(); ++i) {\n+            const auto& u = x[i];\n+            if (u*u != 0.0)\n+                OPM_THROW(std::logic_error,\n+                          \"The preconditioner is assumed not to modify the initial solution!\");\n+        }\n+#endif // NDEBUG\n+\n+        convergenceCriterion_->setInitial(x, r);\n+        if (convergenceCriterion_->converged()) {\n+            report_.setConverged(true);\n+            return report_.converged();\n+        }\n+\n+        if (verbosity_ > 0) {\n+            std::cout << \"-------- BiCGStabSolver --------\" << std::endl;\n+            convergenceCriterion_->printInitial();\n+        }\n+\n+        // r0 = b - Ax (i.e., r -= A*x_0 = b, because x_0 == 0)\n+        //A_->applyscaleadd(/*alpha=*/-1.0, x, r);\n+\n+        // r0hat = r0\n+        const Vector& r0hat = *b_;\n+\n+        // rho0 = alpha = omega0 = 1\n+        Scalar rho = 1.0;\n+        Scalar alpha = 1.0;\n+        Scalar omega = 1.0;\n+\n+        // v_0 = p_0 = 0;\n+        Vector v(r);\n+        v = 0.0;\n+        Vector p(v);\n+\n+        // create all the temporary vectors which we need. Be aware that some of them\n+        // actually point to the same object because they are not needed at the same time!\n+        Vector y(x);\n+        Vector& h(x);\n+        Vector& s(r);\n+        Vector z(x);\n+        Vector& t(y);\n+        unsigned n = x.size();\n+\n+        for (; report_.iterations() < maxIterations_; report_.increment()) {\n+            // rho_i = (r0hat,r_(i-1))\n+            Scalar rho_i = scalarProduct_->dot(r0hat, r);\n+\n+            // beta = (rho_i/rho_(i-1))*(alpha/omega_(i-1))\n+            if (std::abs(rho) <= breakdownEps || std::abs(omega) <= breakdownEps)\n+                OPM_THROW(Opm::NumericalProblem,\n+                          \"Breakdown of the BiCGStab solver (division by zero)\");\n+            Scalar beta = (rho_i/rho)*(alpha/omega);\n+\n+            // make rho correspond to the current iteration (i.e., forget rho_(i-1))\n+            rho = rho_i;\n+\n+            // this loop conflates the following operations:\n+            //\n+            // p_i = r_(i-1) + beta*(p_(i-1) - omega_(i-1)*v_(i-1))\n+            // y = p\n+            for (unsigned i = 0; i < n; ++i) {\n+                // p_i = r_(i-1) + beta*(p_(i-1) - omega_(i-1)*v_(i-1))\n+                auto tmp = v[i];\n+                tmp *= omega;\n+                tmp -= p[i];\n+                tmp *= -beta;\n+                p[i] = r[i];\n+                p[i] += tmp;\n+\n+                // y = p\n+                y[i] = p[i];","path":"ewoms/linear/bicgstabsolver.hh","position":null,"original_position":224,"commit_id":"a24a0b3c32c7a189a3ada4edac23e2acd8dee5a8","original_commit_id":"6dcc5a9175adc39c801a694e4c9f0e4a98809fc7","user":{"login":"andlaus","id":1837735,"avatar_url":"https://avatars.githubusercontent.com/u/1837735?v=3","gravatar_id":"","url":"https://api.github.com/users/andlaus","html_url":"https://github.com/andlaus","followers_url":"https://api.github.com/users/andlaus/followers","following_url":"https://api.github.com/users/andlaus/following{/other_user}","gists_url":"https://api.github.com/users/andlaus/gists{/gist_id}","starred_url":"https://api.github.com/users/andlaus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andlaus/subscriptions","organizations_url":"https://api.github.com/users/andlaus/orgs","repos_url":"https://api.github.com/users/andlaus/repos","events_url":"https://api.github.com/users/andlaus/events{/privacy}","received_events_url":"https://api.github.com/users/andlaus/received_events","type":"User","site_admin":false},"body":"ok, it looks like this is not required because the Dune docu mandates y to be `K^-1*p`. (whether all preconditioners really adhere to this, I cannot say, though.) changed, thanks.","created_at":"2017-01-02T14:27:25Z","updated_at":"2017-01-02T14:27:25Z","html_url":"https://github.com/OPM/ewoms/pull/120#discussion_r94322866","pull_request_url":"https://api.github.com/repos/OPM/ewoms/pulls/120","_links":{"self":{"href":"https://api.github.com/repos/OPM/ewoms/pulls/comments/94322866"},"html":{"href":"https://github.com/OPM/ewoms/pull/120#discussion_r94322866"},"pull_request":{"href":"https://api.github.com/repos/OPM/ewoms/pulls/120"}}},"pull_request":{"url":"https://api.github.com/repos/OPM/ewoms/pulls/120","id":99647950,"html_url":"https://github.com/OPM/ewoms/pull/120","diff_url":"https://github.com/OPM/ewoms/pull/120.diff","patch_url":"https://github.com/OPM/ewoms/pull/120.patch","issue_url":"https://api.github.com/repos/OPM/ewoms/issues/120","number":120,"state":"open","locked":false,"title":"Implement a bicgstab linear solver","user":{"login":"andlaus","id":1837735,"avatar_url":"https://avatars.githubusercontent.com/u/1837735?v=3","gravatar_id":"","url":"https://api.github.com/users/andlaus","html_url":"https://github.com/andlaus","followers_url":"https://api.github.com/users/andlaus/followers","following_url":"https://api.github.com/users/andlaus/following{/other_user}","gists_url":"https://api.github.com/users/andlaus/gists{/gist_id}","starred_url":"https://api.github.com/users/andlaus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andlaus/subscriptions","organizations_url":"https://api.github.com/users/andlaus/orgs","repos_url":"https://api.github.com/users/andlaus/repos","events_url":"https://api.github.com/users/andlaus/events{/privacy}","received_events_url":"https://api.github.com/users/andlaus/received_events","type":"User","site_admin":false},"body":"I.e., the `solvers.hh` file is removed. The main motivation for this is that it avoids having to distribute a file with a potentially incompatible license (i.e., GPLv2 + template exception vs GPLv2+), but the home-brewn bicgstab solver also seems to perform a tiny bit better (i.e., <= 3%) .\r\n\r\nAlso, the unmodified dune-istl linear solvers are made easily accessible. Of these, the restarted GMRES solver with the ILU-2 preconditioner is used for the water-air test problem, but I do not really recommend using these solvers because BiCGSTAB tends to be 20% to 30% slower than our home-brewn implementation (this is because the dune-istl solvers cannot use custom convergence criteria), but dune-istl offers more choices than just BiCGStab and this functionallity could be helpful when debugging issues related to solving the linear systems of equations.\r\n\r\nNote that regardless of how pedantic the interpretation of DUNE's license is, there are no licensing issues anymore because we do no longer distribute any files derived from DUNE (for which the template exception might or might not apply).","created_at":"2016-12-29T11:59:49Z","updated_at":"2017-01-02T14:27:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3c1c6437d8ff93f098109628eb3305bdefab6545","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/OPM/ewoms/pulls/120/commits","review_comments_url":"https://api.github.com/repos/OPM/ewoms/pulls/120/comments","review_comment_url":"https://api.github.com/repos/OPM/ewoms/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OPM/ewoms/issues/120/comments","statuses_url":"https://api.github.com/repos/OPM/ewoms/statuses/a24a0b3c32c7a189a3ada4edac23e2acd8dee5a8","head":{"label":"andlaus:implement_bicgstab","ref":"implement_bicgstab","sha":"a24a0b3c32c7a189a3ada4edac23e2acd8dee5a8","user":{"login":"andlaus","id":1837735,"avatar_url":"https://avatars.githubusercontent.com/u/1837735?v=3","gravatar_id":"","url":"https://api.github.com/users/andlaus","html_url":"https://github.com/andlaus","followers_url":"https://api.github.com/users/andlaus/followers","following_url":"https://api.github.com/users/andlaus/following{/other_user}","gists_url":"https://api.github.com/users/andlaus/gists{/gist_id}","starred_url":"https://api.github.com/users/andlaus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andlaus/subscriptions","organizations_url":"https://api.github.com/users/andlaus/orgs","repos_url":"https://api.github.com/users/andlaus/repos","events_url":"https://api.github.com/users/andlaus/events{/privacy}","received_events_url":"https://api.github.com/users/andlaus/received_events","type":"User","site_admin":false},"repo":{"id":24144469,"name":"ewoms","full_name":"andlaus/ewoms","owner":{"login":"andlaus","id":1837735,"avatar_url":"https://avatars.githubusercontent.com/u/1837735?v=3","gravatar_id":"","url":"https://api.github.com/users/andlaus","html_url":"https://github.com/andlaus","followers_url":"https://api.github.com/users/andlaus/followers","following_url":"https://api.github.com/users/andlaus/following{/other_user}","gists_url":"https://api.github.com/users/andlaus/gists{/gist_id}","starred_url":"https://api.github.com/users/andlaus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andlaus/subscriptions","organizations_url":"https://api.github.com/users/andlaus/orgs","repos_url":"https://api.github.com/users/andlaus/repos","events_url":"https://api.github.com/users/andlaus/events{/privacy}","received_events_url":"https://api.github.com/users/andlaus/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/andlaus/ewoms","description":"The eWoms Porous Media Simulation Framework","fork":true,"url":"https://api.github.com/repos/andlaus/ewoms","forks_url":"https://api.github.com/repos/andlaus/ewoms/forks","keys_url":"https://api.github.com/repos/andlaus/ewoms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andlaus/ewoms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andlaus/ewoms/teams","hooks_url":"https://api.github.com/repos/andlaus/ewoms/hooks","issue_events_url":"https://api.github.com/repos/andlaus/ewoms/issues/events{/number}","events_url":"https://api.github.com/repos/andlaus/ewoms/events","assignees_url":"https://api.github.com/repos/andlaus/ewoms/assignees{/user}","branches_url":"https://api.github.com/repos/andlaus/ewoms/branches{/branch}","tags_url":"https://api.github.com/repos/andlaus/ewoms/tags","blobs_url":"https://api.github.com/repos/andlaus/ewoms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andlaus/ewoms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andlaus/ewoms/git/refs{/sha}","trees_url":"https://api.github.com/repos/andlaus/ewoms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andlaus/ewoms/statuses/{sha}","languages_url":"https://api.github.com/repos/andlaus/ewoms/languages","stargazers_url":"https://api.github.com/repos/andlaus/ewoms/stargazers","contributors_url":"https://api.github.com/repos/andlaus/ewoms/contributors","subscribers_url":"https://api.github.com/repos/andlaus/ewoms/subscribers","subscription_url":"https://api.github.com/repos/andlaus/ewoms/subscription","commits_url":"https://api.github.com/repos/andlaus/ewoms/commits{/sha}","git_commits_url":"https://api.github.com/repos/andlaus/ewoms/git/commits{/sha}","comments_url":"https://api.github.com/repos/andlaus/ewoms/comments{/number}","issue_comment_url":"https://api.github.com/repos/andlaus/ewoms/issues/comments{/number}","contents_url":"https://api.github.com/repos/andlaus/ewoms/contents/{+path}","compare_url":"https://api.github.com/repos/andlaus/ewoms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andlaus/ewoms/merges","archive_url":"https://api.github.com/repos/andlaus/ewoms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andlaus/ewoms/downloads","issues_url":"https://api.github.com/repos/andlaus/ewoms/issues{/number}","pulls_url":"https://api.github.com/repos/andlaus/ewoms/pulls{/number}","milestones_url":"https://api.github.com/repos/andlaus/ewoms/milestones{/number}","notifications_url":"https://api.github.com/repos/andlaus/ewoms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andlaus/ewoms/labels{/name}","releases_url":"https://api.github.com/repos/andlaus/ewoms/releases{/id}","deployments_url":"https://api.github.com/repos/andlaus/ewoms/deployments","created_at":"2014-09-17T12:49:49Z","updated_at":"2016-01-17T20:41:12Z","pushed_at":"2017-01-02T14:25:15Z","git_url":"git://github.com/andlaus/ewoms.git","ssh_url":"git@github.com:andlaus/ewoms.git","clone_url":"https://github.com/andlaus/ewoms.git","svn_url":"https://github.com/andlaus/ewoms","homepage":null,"size":25158,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"OPM:master","ref":"master","sha":"5a56a9d7b35efec64a7873e7366a04b75573584c","user":{"login":"OPM","id":1827197,"avatar_url":"https://avatars.githubusercontent.com/u/1827197?v=3","gravatar_id":"","url":"https://api.github.com/users/OPM","html_url":"https://github.com/OPM","followers_url":"https://api.github.com/users/OPM/followers","following_url":"https://api.github.com/users/OPM/following{/other_user}","gists_url":"https://api.github.com/users/OPM/gists{/gist_id}","starred_url":"https://api.github.com/users/OPM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OPM/subscriptions","organizations_url":"https://api.github.com/users/OPM/orgs","repos_url":"https://api.github.com/users/OPM/repos","events_url":"https://api.github.com/users/OPM/events{/privacy}","received_events_url":"https://api.github.com/users/OPM/received_events","type":"Organization","site_admin":false},"repo":{"id":4859310,"name":"ewoms","full_name":"OPM/ewoms","owner":{"login":"OPM","id":1827197,"avatar_url":"https://avatars.githubusercontent.com/u/1827197?v=3","gravatar_id":"","url":"https://api.github.com/users/OPM","html_url":"https://github.com/OPM","followers_url":"https://api.github.com/users/OPM/followers","following_url":"https://api.github.com/users/OPM/following{/other_user}","gists_url":"https://api.github.com/users/OPM/gists{/gist_id}","starred_url":"https://api.github.com/users/OPM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OPM/subscriptions","organizations_url":"https://api.github.com/users/OPM/orgs","repos_url":"https://api.github.com/users/OPM/repos","events_url":"https://api.github.com/users/OPM/events{/privacy}","received_events_url":"https://api.github.com/users/OPM/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OPM/ewoms","description":"The eWoms Porous Media Simulation Framework","fork":false,"url":"https://api.github.com/repos/OPM/ewoms","forks_url":"https://api.github.com/repos/OPM/ewoms/forks","keys_url":"https://api.github.com/repos/OPM/ewoms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OPM/ewoms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OPM/ewoms/teams","hooks_url":"https://api.github.com/repos/OPM/ewoms/hooks","issue_events_url":"https://api.github.com/repos/OPM/ewoms/issues/events{/number}","events_url":"https://api.github.com/repos/OPM/ewoms/events","assignees_url":"https://api.github.com/repos/OPM/ewoms/assignees{/user}","branches_url":"https://api.github.com/repos/OPM/ewoms/branches{/branch}","tags_url":"https://api.github.com/repos/OPM/ewoms/tags","blobs_url":"https://api.github.com/repos/OPM/ewoms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OPM/ewoms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OPM/ewoms/git/refs{/sha}","trees_url":"https://api.github.com/repos/OPM/ewoms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OPM/ewoms/statuses/{sha}","languages_url":"https://api.github.com/repos/OPM/ewoms/languages","stargazers_url":"https://api.github.com/repos/OPM/ewoms/stargazers","contributors_url":"https://api.github.com/repos/OPM/ewoms/contributors","subscribers_url":"https://api.github.com/repos/OPM/ewoms/subscribers","subscription_url":"https://api.github.com/repos/OPM/ewoms/subscription","commits_url":"https://api.github.com/repos/OPM/ewoms/commits{/sha}","git_commits_url":"https://api.github.com/repos/OPM/ewoms/git/commits{/sha}","comments_url":"https://api.github.com/repos/OPM/ewoms/comments{/number}","issue_comment_url":"https://api.github.com/repos/OPM/ewoms/issues/comments{/number}","contents_url":"https://api.github.com/repos/OPM/ewoms/contents/{+path}","compare_url":"https://api.github.com/repos/OPM/ewoms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OPM/ewoms/merges","archive_url":"https://api.github.com/repos/OPM/ewoms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OPM/ewoms/downloads","issues_url":"https://api.github.com/repos/OPM/ewoms/issues{/number}","pulls_url":"https://api.github.com/repos/OPM/ewoms/pulls{/number}","milestones_url":"https://api.github.com/repos/OPM/ewoms/milestones{/number}","notifications_url":"https://api.github.com/repos/OPM/ewoms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OPM/ewoms/labels{/name}","releases_url":"https://api.github.com/repos/OPM/ewoms/releases{/id}","deployments_url":"https://api.github.com/repos/OPM/ewoms/deployments","created_at":"2012-07-02T12:07:07Z","updated_at":"2016-08-22T15:29:47Z","pushed_at":"2017-01-02T14:25:17Z","git_url":"git://github.com/OPM/ewoms.git","ssh_url":"git@github.com:OPM/ewoms.git","clone_url":"https://github.com/OPM/ewoms.git","svn_url":"https://github.com/OPM/ewoms","homepage":null,"size":25156,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":16,"mirror_url":null,"open_issues_count":3,"forks":16,"open_issues":3,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OPM/ewoms/pulls/120"},"html":{"href":"https://github.com/OPM/ewoms/pull/120"},"issue":{"href":"https://api.github.com/repos/OPM/ewoms/issues/120"},"comments":{"href":"https://api.github.com/repos/OPM/ewoms/issues/120/comments"},"review_comments":{"href":"https://api.github.com/repos/OPM/ewoms/pulls/120/comments"},"review_comment":{"href":"https://api.github.com/repos/OPM/ewoms/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OPM/ewoms/pulls/120/commits"},"statuses":{"href":"https://api.github.com/repos/OPM/ewoms/statuses/a24a0b3c32c7a189a3ada4edac23e2acd8dee5a8"}}}}
{"actor":{"display_login":"andlaus"}}