{"action":"created","comment":{"url":"https://api.github.com/repos/OPM/opm-core/pulls/comments/41970544","id":41970544,"diff_hunk":"@@ -0,0 +1,497 @@\n+/*\n+  Copyright 2015 Statoil ASA.\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 3 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+\n+#ifndef OPM_PINCHPROCESSOR_HEADER_INCLUDED\n+#define OPM_PINCHPROCESSOR_HEADER_INCLUDED\n+\n+#include <opm/common/ErrorMacros.hpp>\n+#include <opm/core/grid/GridHelpers.hpp>\n+#include <opm/parser/eclipse/EclipseState/Grid/NNC.hpp>\n+#include <opm/parser/eclipse/EclipseState/Grid/FaceDir.hpp>\n+#include <opm/parser/eclipse/EclipseState/Grid/PinchMode.hpp>\n+#include <opm/core/utility/Units.hpp>\n+#include <array>\n+#include <iostream>\n+#include <algorithm>\n+#include <unordered_map>\n+#include <limits>\n+\n+namespace Opm\n+{\n+\n+    using namespace Opm::UgGridHelpers;\n+\n+    template <class Grid>\n+    class PinchProcessor\n+    {\n+    public:\n+        /// \\brief Create a Pinch processor.\n+        /// \\param[in]    minpvValue   value in MINPV keyword\n+        /// \\param[in]    thickness    item 2 in PINCH keyword\n+        /// \\param[in]    transMode    item 4 in PINCH keyword\n+        /// \\param[in]    multzMode    item 5 in PINCH keyword\n+        PinchProcessor(const double minpvValue,\n+                       const double thickness,\n+                       const PinchMode::ModeEnum transMode,\n+                       const PinchMode::ModeEnum multzMode);\n+        /// Generate NNCs for cells which pv is less than MINPV.\n+        /// \\param[in]    Grid    cpgrid or unstructured grid\n+        /// \\param[in]    htrans  half cell transmissibility\n+        /// \\param[in]    multz   Z+ transmissibility multiplier\n+        /// \\param[in]    pv      pore volume for all the cells\n+        /// \\param[in]    dz      dz for all the cells\n+        /// \\param[in]    nnc     non-neighbor connection class\n+        /// Algorithm:\n+        /// 1. Mark all the cells which pv and dz less than minpvValue and thickness.\n+        /// 2. Find out proper pinchouts column and associate top and bottom cells.\n+        /// 3. Compute transmissibility for nncs.\n+        /// 4. Apply multz due to different multz options.\n+        void process(const Grid& grid,\n+                     const std::vector<double>& htrans,\n+                     const std::vector<int>& actnum,\n+                     const std::vector<double>& multz,\n+                     const std::vector<double>& pv,\n+                     const std::vector<double>& dz,\n+                     NNC& nnc);\n+\n+    private:\n+        double minpvValue_;\n+        double thickness_;\n+        PinchMode::ModeEnum transMode_;\n+        PinchMode::ModeEnum multzMode_;\n+        \n+        /// Mark minpved cells.\n+        std::vector<int> getMinpvCells_(const Grid& grid,\n+                                        const std::vector<int>& actnum,\n+                                        const std::vector<double>& pv,\n+                                        const std::vector<double>& dz);\n+\n+        /// Get the interface for two cells.\n+        int interface_(const Grid& grid,\n+                       const int cellIdx1,\n+                       const int cellIdx2);\n+\n+        /// Get the proper face for one cell.\n+        int interface_(const Grid& grid,\n+                       const int cellIdx,\n+                       const Opm::FaceDir::DirEnum& faceDir);\n+\n+        /// Get pinchouts column.\n+        std::vector<std::vector<int> >\n+        getPinchoutsColumn_(const Grid& grid,\n+                            const std::vector<int>& actnum,\n+                            std::vector<int>& minpvCells);\n+        \n+        /// Get global cell index.\n+        int getGlobalIndex_(const int i, const int j, const int k, const int* dims);\n+\n+        /// Get cartesian index.\n+        std::array<int, 3> getCartIndex_(const int idx,\n+                                         const int* dims);\n+\n+        /// Compute transmissibility for nnc.\n+        std::vector<double> transCompute_(const Grid& grid,\n+                                          const std::vector<double>& htrans,\n+                                          const std::vector<int>& pinCells,\n+                                          const std::vector<int>& pinFaces,\n+                                          const std::vector<double>& multz);\n+\n+        /// Get map between half-trans index and the pair of face index and cell index.\n+        std::vector<int> getHfIdxMap_(const Grid& grid);\n+        \n+        /// Get active cell index.\n+        int getActiveCellIdx_(const Grid& grid,\n+                              const int cellIdx);\n+\n+        /// Item 4 in PINCH keyword. \n+        void transTopbot_(const Grid& grid,\n+                          const std::vector<double>& htrans,\n+                          const std::vector<int>& actnum,\n+                          const std::vector<double>& multz,\n+                          const std::vector<double>& pv,\n+                          const std::vector<double>& dz,\n+                          NNC& nnc);\n+        \n+        /// Item 5 in PINCH keyword.\n+        std::unordered_multimap<int, double> multzOptions_(const Grid& grid,\n+                                                           const std::vector<int>& pinCells,\n+                                                           const std::vector<int>& pinFaces,\n+                                                           const std::vector<double>& multz,\n+                                                           const std::vector<std::vector<int> >& seg);\n+\n+        /// Apply multz vector to face transmissibility.\n+        void applyMultz_(std::vector<double>& trans,\n+                         const std::unordered_multimap<int, double>& multzmap);\n+\n+    };\n+\n+\n+    template <class Grid>\n+    inline PinchProcessor<Grid>::PinchProcessor(const double minpv,\n+                                                const double thickness,\n+                                                const PinchMode::ModeEnum transMode,\n+                                                const PinchMode::ModeEnum multzMode)\n+    {\n+        minpvValue_ = minpv;\n+        thickness_  = thickness;\n+        transMode_  = transMode;\n+        multzMode_  = multzMode;\n+    }\n+\n+    \n+    template <class Grid>\n+    inline int PinchProcessor<Grid>::getGlobalIndex_(const int i, const int j, const int k, const int* dims)\n+    {\n+        return i + dims[0] * (j + dims[1] * k);\n+    }\n+\n+    template <class Grid>\n+    inline std::array<int, 3> PinchProcessor<Grid>::getCartIndex_(const int idx,\n+                                                                  const int* dims)\n+    {\n+        std::array<int, 3> ijk;\n+        ijk[0] = (idx % dims[0]);\n+        ijk[1] = ((idx / dims[0]) % dims[1]);\n+        ijk[2] = ((idx / dims[0]) / dims[1]);\n+\n+        return ijk;\n+    }\n+\n+    template<class Grid>\n+    inline int PinchProcessor<Grid>::interface_(const Grid& grid,\n+                                                    const int cellIdx1,\n+                                                    const int cellIdx2)\n+    {\n+        auto cell_faces = cell2Faces(grid);\n+        std::vector<int> cellFaces1;\n+        std::vector<int> cellFaces2;\n+        int commonFace = -1;\n+        auto actCellIdx1 = getActiveCellIdx_(grid, cellIdx1);\n+        auto actCellIdx2 = getActiveCellIdx_(grid, cellIdx2);\n+        auto cellFacesRange1 = cell_faces[actCellIdx1];\n+        for (auto cellFaceIter1 = cellFacesRange1.begin(); cellFaceIter1 != cellFacesRange1.end(); ++cellFaceIter1) {\n+            cellFaces1.push_back(*cellFaceIter1);\n+        }\n+\n+        auto cellFacesRange2 = cell_faces[actCellIdx2];\n+        for (auto cellFaceIter2 = cellFacesRange2.begin(); cellFaceIter2 != cellFacesRange2.end(); ++cellFaceIter2) {\n+            cellFaces2.push_back(*cellFaceIter2);\n+        }\n+\n+        for (auto& f1 : cellFaces1) {\n+            for (auto& f2 : cellFaces2) {\n+                if (f1 == f2) {\n+                    commonFace = f1;\n+                    break;\n+                }\n+            }\n+        }\n+\n+        auto ijk1 = getCartIndex_(cellIdx1, cartDims(grid));\n+        auto ijk2 = getCartIndex_(cellIdx2, cartDims(grid));\n+\n+        if (commonFace == -1) {\n+            OPM_THROW(std::logic_error, \"Couldn't find the common face for cell \" << cellIdx1<< \"(\"<<ijk1[0]<<\",\"<<ijk1[1]<<\",\"<<ijk1[2]<<\")\"<< \" and \" << cellIdx2<<\"(\"<<ijk2[0]<<\",\"<<ijk2[1]<<\",\"<<ijk2[2]<<\")\");\n+        }\n+\n+        return commonFace;\n+    }\n+\n+    template<class Grid>\n+    inline int PinchProcessor<Grid>::interface_(const Grid& grid,\n+                                                    const int cellIdx,\n+                                                    const Opm::FaceDir::DirEnum& faceDir)\n+    {\n+        auto actCellIdx = getActiveCellIdx_(grid, cellIdx);\n+        auto cell_faces = cell2Faces(grid);\n+        auto cellFacesRange = cell_faces[actCellIdx];\n+        int faceIdx = -1;\n+        for (auto cellFaceIter = cellFacesRange.begin(); cellFaceIter != cellFacesRange.end(); ++cellFaceIter) {\n+            int tag = faceTag(grid, cellFaceIter);\n+            if ( (faceDir == Opm::FaceDir::ZMinus && tag == 4) || (faceDir == Opm::FaceDir::ZPlus && tag == 5) ) {\n+                faceIdx = *cellFaceIter;\n+            }\n+        }\n+        \n+        if (faceIdx == -1) {\n+            OPM_THROW(std::logic_error, \"Couldn't find the face for cell .\" << cellIdx);\n+        }\n+        \n+        return faceIdx;\n+    }\n+\n+\n+    template<class Grid>\n+    inline std::vector<int> PinchProcessor<Grid>::getMinpvCells_(const Grid& grid,\n+                                                                 const std::vector<int>& actnum,\n+                                                                 const std::vector<double>& pv,\n+                                                                 const std::vector<double>& dz)\n+    {\n+        const int nc = numCells(grid);\n+        std::vector<int> minpvCells(pv.size(), 0);\n+        const int* global_cell = globalCell(grid);\n+        for (int cellIdx = 0; cellIdx < nc; ++cellIdx) {\n+            const int idx = global_cell[cellIdx];\n+            if (actnum[idx]) {\n+                if (pv[idx] < minpvValue_) {\n+                    minpvCells[idx] = 1;\n+                }\n+            }\n+        }     \n+        return minpvCells;\n+    }\n+\n+    template<class Grid>\n+    inline std::vector<int> PinchProcessor<Grid>::getHfIdxMap_(const Grid& grid)\n+    {\n+        std::vector<int> hf_ix(2*numFaces(grid), -1);\n+        const auto& f2c = faceCells(grid);\n+        const auto& cf = cell2Faces(grid);\n+        \n+        for (int c = 0, i = 0; c < numCells(grid); ++c) {\n+            for (const auto& f: cf[c]) {\n+                const auto off = 0 + (f2c(f, 0) != c);\n+                hf_ix[2*f + off] = i++;\n+            }\n+        }\n+        return hf_ix;\n+    }\n+\n+\n+\n+    template<class Grid>\n+    inline int PinchProcessor<Grid>::getActiveCellIdx_(const Grid& grid,\n+                                                       const int cellIdx)\n+    {\n+        const int nc = numCells(grid);\n+        const int* global_cell = globalCell(grid);\n+        int idx = -1;\n+        for (int i = 0; i < nc; ++i) {\n+            if (global_cell[i] == cellIdx) {\n+                idx = i;\n+                break;\n+            }\n+        }\n+        return idx;\n+    }\n+\n+\n+    template<class Grid>\n+    inline std::vector<double> PinchProcessor<Grid>::transCompute_(const Grid& grid,\n+                                                                   const std::vector<double>& htrans,\n+                                                                   const std::vector<int>& pinCells,\n+                                                                   const std::vector<int>& pinFaces,\n+                                                                   const std::vector<double>& multz)       \n+    {\n+        const int nc = numCells(grid);\n+        const int nf = numFaces(grid);\n+        std::vector<double> trans(nf, 0);\n+        int cellFaceIdx = 0;\n+        auto cell2Faces = Opm::UgGridHelpers::cell2Faces(grid);\n+        const auto& hfmap = getHfIdxMap_(grid); \n+        const auto& f2c = faceCells(grid);\n+        for (int cellIdx = 0; cellIdx < nc; ++cellIdx) {\n+            auto cellFacesRange = cell2Faces[cellIdx];\n+            for (auto cellFaceIter = cellFacesRange.begin(); cellFaceIter != cellFacesRange.end(); ++cellFaceIter, ++cellFaceIdx) {\n+                const int faceIdx = *cellFaceIter;                \n+                if (std::find(pinFaces.begin(), pinFaces.end(), faceIdx) == pinFaces.end()) {","path":"opm/core/grid/PinchProcessor.hpp","position":313,"original_position":313,"commit_id":"30b7842c5d5a374168554dc83fd4fd5c65888ef4","original_commit_id":"30b7842c5d5a374168554dc83fd4fd5c65888ef4","user":{"login":"atgeirr","id":1876621,"avatar_url":"https://avatars.githubusercontent.com/u/1876621?v=3","gravatar_id":"","url":"https://api.github.com/users/atgeirr","html_url":"https://github.com/atgeirr","followers_url":"https://api.github.com/users/atgeirr/followers","following_url":"https://api.github.com/users/atgeirr/following{/other_user}","gists_url":"https://api.github.com/users/atgeirr/gists{/gist_id}","starred_url":"https://api.github.com/users/atgeirr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atgeirr/subscriptions","organizations_url":"https://api.github.com/users/atgeirr/orgs","repos_url":"https://api.github.com/users/atgeirr/repos","events_url":"https://api.github.com/users/atgeirr/events{/privacy}","received_events_url":"https://api.github.com/users/atgeirr/received_events","type":"User","site_admin":false},"body":"The std::find is a linear search, so it could be expensive. We may have to change this for acceptable performance on huge grids, but I think it is ok for now. A minor change that would improve performance (although not asymptotic complexity) would be to store the result of the find instead of redoing it below.","created_at":"2015-10-14T09:11:02Z","updated_at":"2015-10-14T09:11:02Z","html_url":"https://github.com/OPM/opm-core/pull/892#discussion_r41970544","pull_request_url":"https://api.github.com/repos/OPM/opm-core/pulls/892","_links":{"self":{"href":"https://api.github.com/repos/OPM/opm-core/pulls/comments/41970544"},"html":{"href":"https://github.com/OPM/opm-core/pull/892#discussion_r41970544"},"pull_request":{"href":"https://api.github.com/repos/OPM/opm-core/pulls/892"}}},"pull_request":{"url":"https://api.github.com/repos/OPM/opm-core/pulls/892","id":46366846,"html_url":"https://github.com/OPM/opm-core/pull/892","diff_url":"https://github.com/OPM/opm-core/pull/892.diff","patch_url":"https://github.com/OPM/opm-core/pull/892.patch","issue_url":"https://api.github.com/repos/OPM/opm-core/issues/892","number":892,"state":"open","locked":false,"title":"PinchProcessor","user":{"login":"qilicun","id":2907423,"avatar_url":"https://avatars.githubusercontent.com/u/2907423?v=3","gravatar_id":"","url":"https://api.github.com/users/qilicun","html_url":"https://github.com/qilicun","followers_url":"https://api.github.com/users/qilicun/followers","following_url":"https://api.github.com/users/qilicun/following{/other_user}","gists_url":"https://api.github.com/users/qilicun/gists{/gist_id}","starred_url":"https://api.github.com/users/qilicun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qilicun/subscriptions","organizations_url":"https://api.github.com/users/qilicun/orgs","repos_url":"https://api.github.com/users/qilicun/repos","events_url":"https://api.github.com/users/qilicun/events{/privacy}","received_events_url":"https://api.github.com/users/qilicun/received_events","type":"User","site_admin":false},"body":"This PR aims to provide a rough  PinchProcessor for PINCH and MINPV keywords. Build non-neighbor connections for the cells which's pore volume less than MINPV or the thickness less than the value of item 2 in PINCH keyword. This processor just support TOPBOT in item 4 and TOP in item 5, ALL in item 5 is also implemented but not verified, since ECLIPSE output for this part is a little strange.\r\n\r\nThe general ideas is:\r\n-  Mark all the Minpved cells, including small thickness cells.\r\n-  Indentify the Pinchous column, because NNC needs top and bottom cell of the column are active. So the pinchouts column can be lots situation, the kernel part of this processor is to take care of the following cases:\r\n    - both sides are active --- best situation,\r\n    - one side are active. Look up or down this side from the pillar if active cell can be found, rebuild this column, if not drop this one.\r\n    - both side are inactive. Same stratedy as above.\r\n\r\nNorne is tested with this processor. The output is too long I think it's better to paste it in the comments.\r\nFor most of the NNC in NORNE due to MINPV, OPM create very close results to ECLIPSE, but for some cells, the transmissbiliy is far from ECLIPSE, needs to find out what happens for these cells.\r\nSo I think this processor is not ready to merge, please fell free to make comments to help me to improve.","created_at":"2015-09-30T06:51:45Z","updated_at":"2015-10-14T09:11:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"33389a4a0b96c2070dca3a5dd7a5540f3758c120","assignee":null,"milestone":{"url":"https://api.github.com/repos/OPM/opm-core/milestones/4","html_url":"https://github.com/OPM/opm-core/milestones/Release%202015.10","labels_url":"https://api.github.com/repos/OPM/opm-core/milestones/4/labels","id":1033465,"number":4,"title":"Release 2015.10","description":"","creator":{"login":"atgeirr","id":1876621,"avatar_url":"https://avatars.githubusercontent.com/u/1876621?v=3","gravatar_id":"","url":"https://api.github.com/users/atgeirr","html_url":"https://github.com/atgeirr","followers_url":"https://api.github.com/users/atgeirr/followers","following_url":"https://api.github.com/users/atgeirr/following{/other_user}","gists_url":"https://api.github.com/users/atgeirr/gists{/gist_id}","starred_url":"https://api.github.com/users/atgeirr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atgeirr/subscriptions","organizations_url":"https://api.github.com/users/atgeirr/orgs","repos_url":"https://api.github.com/users/atgeirr/repos","events_url":"https://api.github.com/users/atgeirr/events{/privacy}","received_events_url":"https://api.github.com/users/atgeirr/received_events","type":"User","site_admin":false},"open_issues":22,"closed_issues":5,"state":"open","created_at":"2015-03-23T08:03:37Z","updated_at":"2015-10-14T07:36:27Z","due_on":"2015-10-26T23:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/OPM/opm-core/pulls/892/commits","review_comments_url":"https://api.github.com/repos/OPM/opm-core/pulls/892/comments","review_comment_url":"https://api.github.com/repos/OPM/opm-core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OPM/opm-core/issues/892/comments","statuses_url":"https://api.github.com/repos/OPM/opm-core/statuses/30b7842c5d5a374168554dc83fd4fd5c65888ef4","head":{"label":"qilicun:pinchprocessor","ref":"pinchprocessor","sha":"30b7842c5d5a374168554dc83fd4fd5c65888ef4","user":{"login":"qilicun","id":2907423,"avatar_url":"https://avatars.githubusercontent.com/u/2907423?v=3","gravatar_id":"","url":"https://api.github.com/users/qilicun","html_url":"https://github.com/qilicun","followers_url":"https://api.github.com/users/qilicun/followers","following_url":"https://api.github.com/users/qilicun/following{/other_user}","gists_url":"https://api.github.com/users/qilicun/gists{/gist_id}","starred_url":"https://api.github.com/users/qilicun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qilicun/subscriptions","organizations_url":"https://api.github.com/users/qilicun/orgs","repos_url":"https://api.github.com/users/qilicun/repos","events_url":"https://api.github.com/users/qilicun/events{/privacy}","received_events_url":"https://api.github.com/users/qilicun/received_events","type":"User","site_admin":false},"repo":{"id":11916153,"name":"opm-core","full_name":"qilicun/opm-core","owner":{"login":"qilicun","id":2907423,"avatar_url":"https://avatars.githubusercontent.com/u/2907423?v=3","gravatar_id":"","url":"https://api.github.com/users/qilicun","html_url":"https://github.com/qilicun","followers_url":"https://api.github.com/users/qilicun/followers","following_url":"https://api.github.com/users/qilicun/following{/other_user}","gists_url":"https://api.github.com/users/qilicun/gists{/gist_id}","starred_url":"https://api.github.com/users/qilicun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qilicun/subscriptions","organizations_url":"https://api.github.com/users/qilicun/orgs","repos_url":"https://api.github.com/users/qilicun/repos","events_url":"https://api.github.com/users/qilicun/events{/privacy}","received_events_url":"https://api.github.com/users/qilicun/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/qilicun/opm-core","description":"Open Porous Media Core Library","fork":true,"url":"https://api.github.com/repos/qilicun/opm-core","forks_url":"https://api.github.com/repos/qilicun/opm-core/forks","keys_url":"https://api.github.com/repos/qilicun/opm-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/qilicun/opm-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/qilicun/opm-core/teams","hooks_url":"https://api.github.com/repos/qilicun/opm-core/hooks","issue_events_url":"https://api.github.com/repos/qilicun/opm-core/issues/events{/number}","events_url":"https://api.github.com/repos/qilicun/opm-core/events","assignees_url":"https://api.github.com/repos/qilicun/opm-core/assignees{/user}","branches_url":"https://api.github.com/repos/qilicun/opm-core/branches{/branch}","tags_url":"https://api.github.com/repos/qilicun/opm-core/tags","blobs_url":"https://api.github.com/repos/qilicun/opm-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/qilicun/opm-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/qilicun/opm-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/qilicun/opm-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/qilicun/opm-core/statuses/{sha}","languages_url":"https://api.github.com/repos/qilicun/opm-core/languages","stargazers_url":"https://api.github.com/repos/qilicun/opm-core/stargazers","contributors_url":"https://api.github.com/repos/qilicun/opm-core/contributors","subscribers_url":"https://api.github.com/repos/qilicun/opm-core/subscribers","subscription_url":"https://api.github.com/repos/qilicun/opm-core/subscription","commits_url":"https://api.github.com/repos/qilicun/opm-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/qilicun/opm-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/qilicun/opm-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/qilicun/opm-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/qilicun/opm-core/contents/{+path}","compare_url":"https://api.github.com/repos/qilicun/opm-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/qilicun/opm-core/merges","archive_url":"https://api.github.com/repos/qilicun/opm-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/qilicun/opm-core/downloads","issues_url":"https://api.github.com/repos/qilicun/opm-core/issues{/number}","pulls_url":"https://api.github.com/repos/qilicun/opm-core/pulls{/number}","milestones_url":"https://api.github.com/repos/qilicun/opm-core/milestones{/number}","notifications_url":"https://api.github.com/repos/qilicun/opm-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/qilicun/opm-core/labels{/name}","releases_url":"https://api.github.com/repos/qilicun/opm-core/releases{/id}","created_at":"2013-08-06T05:03:16Z","updated_at":"2014-09-18T05:36:13Z","pushed_at":"2015-10-13T07:14:48Z","git_url":"git://github.com/qilicun/opm-core.git","ssh_url":"git@github.com:qilicun/opm-core.git","clone_url":"https://github.com/qilicun/opm-core.git","svn_url":"https://github.com/qilicun/opm-core","homepage":"http://www.opm-project.org","size":11955,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":1,"default_branch":"master"}},"base":{"label":"OPM:master","ref":"master","sha":"28a793c44836b93e7d590abb8d3271e693019512","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":4787500,"name":"opm-core","full_name":"OPM/opm-core","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/opm-core","description":"Open Porous Media Core Library","fork":false,"url":"https://api.github.com/repos/OPM/opm-core","forks_url":"https://api.github.com/repos/OPM/opm-core/forks","keys_url":"https://api.github.com/repos/OPM/opm-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OPM/opm-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OPM/opm-core/teams","hooks_url":"https://api.github.com/repos/OPM/opm-core/hooks","issue_events_url":"https://api.github.com/repos/OPM/opm-core/issues/events{/number}","events_url":"https://api.github.com/repos/OPM/opm-core/events","assignees_url":"https://api.github.com/repos/OPM/opm-core/assignees{/user}","branches_url":"https://api.github.com/repos/OPM/opm-core/branches{/branch}","tags_url":"https://api.github.com/repos/OPM/opm-core/tags","blobs_url":"https://api.github.com/repos/OPM/opm-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OPM/opm-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OPM/opm-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/OPM/opm-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OPM/opm-core/statuses/{sha}","languages_url":"https://api.github.com/repos/OPM/opm-core/languages","stargazers_url":"https://api.github.com/repos/OPM/opm-core/stargazers","contributors_url":"https://api.github.com/repos/OPM/opm-core/contributors","subscribers_url":"https://api.github.com/repos/OPM/opm-core/subscribers","subscription_url":"https://api.github.com/repos/OPM/opm-core/subscription","commits_url":"https://api.github.com/repos/OPM/opm-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/OPM/opm-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/OPM/opm-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/OPM/opm-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/OPM/opm-core/contents/{+path}","compare_url":"https://api.github.com/repos/OPM/opm-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OPM/opm-core/merges","archive_url":"https://api.github.com/repos/OPM/opm-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OPM/opm-core/downloads","issues_url":"https://api.github.com/repos/OPM/opm-core/issues{/number}","pulls_url":"https://api.github.com/repos/OPM/opm-core/pulls{/number}","milestones_url":"https://api.github.com/repos/OPM/opm-core/milestones{/number}","notifications_url":"https://api.github.com/repos/OPM/opm-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OPM/opm-core/labels{/name}","releases_url":"https://api.github.com/repos/OPM/opm-core/releases{/id}","created_at":"2012-06-25T21:14:06Z","updated_at":"2015-09-02T05:40:29Z","pushed_at":"2015-10-14T07:36:27Z","git_url":"git://github.com/OPM/opm-core.git","ssh_url":"git@github.com:OPM/opm-core.git","clone_url":"https://github.com/OPM/opm-core.git","svn_url":"https://github.com/OPM/opm-core","homepage":"http://www.opm-project.org","size":16568,"stargazers_count":21,"watchers_count":21,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":22,"forks":42,"open_issues":22,"watchers":21,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OPM/opm-core/pulls/892"},"html":{"href":"https://github.com/OPM/opm-core/pull/892"},"issue":{"href":"https://api.github.com/repos/OPM/opm-core/issues/892"},"comments":{"href":"https://api.github.com/repos/OPM/opm-core/issues/892/comments"},"review_comments":{"href":"https://api.github.com/repos/OPM/opm-core/pulls/892/comments"},"review_comment":{"href":"https://api.github.com/repos/OPM/opm-core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OPM/opm-core/pulls/892/commits"},"statuses":{"href":"https://api.github.com/repos/OPM/opm-core/statuses/30b7842c5d5a374168554dc83fd4fd5c65888ef4"}}}}