{"action":"created","comment":{"url":"https://api.github.com/repos/OPM/opm-autodiff/pulls/comments/39544480","id":39544480,"diff_hunk":"@@ -0,0 +1,553 @@\n+/*\n+  Copyright 2015 IRIS AS\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+#ifndef OPM_PARALLELDEBUGOUTPUT_HEADER_INCLUDED\n+#define OPM_PARALLELDEBUGOUTPUT_HEADER_INCLUDED\n+\n+#include <opm/core/grid.h>\n+#include <opm/core/simulator/SimulatorState.hpp>\n+#include <opm/core/simulator/WellState.hpp>\n+#include <opm/core/wells/WellsManager.hpp>\n+\n+#include <opm/autodiff/WellStateFullyImplicitBlackoil.hpp>\n+#include <opm/autodiff/WellStateFullyImplicitBlackoil.hpp>\n+\n+#if HAVE_DUNE_CORNERPOINT\n+#include <dune/grid/common/p2pcommunicator.hh>\n+#endif\n+\n+namespace Opm\n+{\n+\n+    class ParallelDebugOutputInterface\n+    {\n+    protected:\n+        ParallelDebugOutputInterface () {}\n+    public:\n+        virtual ~ParallelDebugOutputInterface() {}\n+\n+        // gather solution to rank 0 for EclipseWriter\n+        virtual bool collectToIORank( const SimulatorState& localReservoirState,\n+                                      const WellState& localWellState ) = 0;\n+\n+        virtual const SimulatorState& globalReservoirState() const = 0 ;\n+        virtual const WellState& globalWellState() const = 0 ;\n+        virtual bool isIORank() const = 0;\n+        virtual int numCells() const = 0 ;\n+        virtual const int* globalCell() const = 0;\n+    };\n+\n+    template <class GridImpl>\n+    class ParallelDebugOutput : public ParallelDebugOutputInterface\n+    {\n+    protected:\n+        const GridImpl& grid_;\n+\n+        const SimulatorState* globalState_;\n+        const WellState*      wellState_;\n+\n+    public:\n+        ParallelDebugOutput ( const GridImpl& grid,\n+                         Opm::EclipseStateConstPtr eclipseState,\n+                         const int )\n+            : grid_( grid ) {}\n+\n+        // gather solution to rank 0 for EclipseWriter\n+        virtual bool collectToIORank( const SimulatorState& localReservoirState,\n+                                      const WellState& localWellState )\n+        {\n+            globalState_ = &localReservoirState;\n+            wellState_   = &localWellState;\n+            return true ;\n+        }\n+\n+        virtual const SimulatorState& globalReservoirState() const { return *globalState_; }\n+        virtual const WellState& globalWellState() const { return *wellState_; }\n+        virtual bool isIORank () const { return true; }\n+        virtual int numCells() const { return grid_.number_of_cells; }\n+        virtual const int* globalCell() const { return grid_.global_cell; }\n+    };\n+\n+#if HAVE_DUNE_CORNERPOINT\n+    template <>\n+    class ParallelDebugOutput< Dune::CpGrid> : public ParallelDebugOutputInterface\n+    {\n+    public:\n+        typedef Dune::CpGrid Grid;\n+        typedef typename Grid :: CollectiveCommunication  CollectiveCommunication;\n+\n+        // global id\n+        class GlobalCellIndex\n+        {\n+            int globalId_;\n+            int localIndex_;\n+            bool isInterior_;\n+        public:\n+            GlobalCellIndex() : globalId_(-1), localIndex_(-1), isInterior_(true) {}\n+            void setGhost() { isInterior_ = false; }\n+\n+            void setId( const int globalId ) { globalId_ = globalId; }\n+            void setIndex( const int localIndex ) { localIndex_ = localIndex; }\n+\n+            int localIndex () const { return localIndex_; }\n+            int id () const { return globalId_; }\n+            bool isInterior() const { return isInterior_; }\n+        };\n+\n+        typedef typename Dune::PersistentContainer< Grid, GlobalCellIndex > GlobalIndexContainer;\n+\n+        static const int dimension = Grid :: dimension ;\n+\n+        typedef typename Grid :: LeafGridView             GridView;\n+        typedef GridView                                  AllGridView;\n+\n+        typedef Dune :: Point2PointCommunicator< Dune :: SimpleMessageBuffer > P2PCommunicatorType;\n+        typedef typename P2PCommunicatorType :: MessageBufferType MessageBufferType;\n+\n+        typedef std::vector< GlobalCellIndex > LocalIndexMapType;\n+\n+        typedef std::vector<int> IndexMapType;\n+        typedef std::vector< IndexMapType > IndexMapStorageType;\n+\n+        class DistributeIndexMapping : public P2PCommunicatorType::DataHandleInterface\n+        {\n+        protected:\n+            const std::vector<int>& distributedGlobalIndex_;\n+            IndexMapType& localIndexMap_;\n+            IndexMapStorageType& indexMaps_;\n+            std::map< const int, const int > globalPosition_;\n+            std::set< int > checkPosition_;\n+\n+        public:\n+            DistributeIndexMapping( const std::vector<int>& globalIndex,\n+                                    const std::vector<int>& distributedGlobalIndex,\n+                                    IndexMapType& localIndexMap,\n+                                    IndexMapStorageType& indexMaps )\n+            : distributedGlobalIndex_( distributedGlobalIndex ),\n+              localIndexMap_( localIndexMap ),\n+              indexMaps_( indexMaps ),\n+              globalPosition_()\n+            {\n+                const size_t size = globalIndex.size();\n+                // create mapping globalIndex --> localIndex\n+                for ( size_t index = 0; index < size; ++index )\n+                {\n+                    globalPosition_.insert( std::make_pair( globalIndex[ index ], index ) );\n+                }\n+\n+                if( ! indexMaps_.empty() )\n+                {\n+                    // for the ioRank create a localIndex to index in global state map\n+                    IndexMapType& indexMap = indexMaps_.back();\n+                    const size_t localSize = localIndexMap_.size();\n+                    indexMap.resize( localSize );\n+                    for( size_t i=0; i<localSize; ++i )\n+                    {\n+                        const int id = distributedGlobalIndex_[ localIndexMap_[ i ] ];\n+                        indexMap[ i ] = id ;\n+#ifndef NDEBUG\n+                        assert( checkPosition_.find( id ) == checkPosition_.end() );\n+                        checkPosition_.insert( id );\n+#endif\n+                    }\n+                }\n+            }\n+\n+            void pack( const int link, MessageBufferType& buffer )\n+            {\n+                // we should only get one link\n+                assert( link == 0 );\n+\n+                // pack all interior global cell id's\n+                const int size = localIndexMap_.size();\n+                buffer.write( size );\n+\n+                for( int index = 0; index < size; ++index )\n+                {\n+                    const int globalIdx = distributedGlobalIndex_[ localIndexMap_[ index ] ];\n+                    buffer.write( globalIdx );\n+                }\n+            }\n+\n+            void unpack( const int link, MessageBufferType& buffer )\n+            {\n+                // get index map for current link\n+                IndexMapType& indexMap = indexMaps_[ link ];\n+                assert( ! globalPosition_.empty() );\n+\n+                // unpack all interior global cell id's\n+                int numCells = 0;\n+                buffer.read( numCells );\n+                indexMap.resize( numCells );\n+                for( int index = 0; index < numCells; ++index )\n+                {\n+                    int globalId = -1;\n+                    buffer.read( globalId );\n+                    assert( globalPosition_.find( globalId ) != globalPosition_.end() );\n+                    indexMap[ index ] = globalPosition_[ globalId ];\n+#ifndef NDEBUG\n+                    assert( checkPosition_.find( globalId ) == checkPosition_.end() );\n+                    checkPosition_.insert( globalId );\n+#endif\n+                }\n+            }\n+        };\n+\n+        enum { ioRank = 0 };\n+\n+        ParallelDebugOutput( const Dune::CpGrid& otherGrid,\n+                             Opm::EclipseStateConstPtr eclipseState,\n+                             const int numPhases )\n+            : toIORankComm_( otherGrid.comm() ),\n+              isIORank_( otherGrid.comm().rank() == ioRank )\n+        {\n+            const CollectiveCommunication& comm = otherGrid.comm();\n+            std::set< int > send, recv;\n+            // the I/O rank receives from all other ranks\n+            if( isIORank() )\n+            {\n+                Dune::CpGrid globalGrid( otherGrid );\n+                globalGrid.switchToGlobalView();\n+\n+                // initialize global state with correct sizes\n+                globalReservoirState_.init( globalGrid.numCells(), globalGrid.numFaces(), numPhases );\n+                // TODO init well state\n+\n+                // Create wells and well state.\n+                WellsManager wells_manager(eclipseState,\n+                                           0,\n+                                           Opm::UgGridHelpers::numCells( globalGrid ),\n+                                           Opm::UgGridHelpers::globalCell( globalGrid ),\n+                                           Opm::UgGridHelpers::cartDims( globalGrid ),\n+                                           Opm::UgGridHelpers::dimensions( globalGrid ),\n+                                           Opm::UgGridHelpers::cell2Faces( globalGrid ),\n+                                           Opm::UgGridHelpers::beginFaceCentroids( globalGrid ),\n+                                           0,\n+                                           false);\n+                const Wells* wells = wells_manager.c_wells();\n+                globalWellState_.init(wells, globalReservoirState_, globalWellState_ );\n+\n+                // copy global cartesian index\n+                globalIndex_ = globalGrid.globalCell();\n+\n+                unsigned int count = 0;\n+                auto gridView = globalGrid.leafGridView();\n+                for( auto it = gridView.template begin< 0 >(),\n+                     end = gridView.template end< 0 >(); it != end; ++it, ++count )\n+                {\n+                }\n+                assert( count == globalIndex_.size() );\n+\n+                for(int i=0; i<comm.size(); ++i)\n+                {\n+                    if( i != ioRank )\n+                    {\n+                        recv.insert( i );\n+                    }\n+                }\n+            }\n+            else // all other simply send to the I/O rank\n+            {\n+                send.insert( ioRank );\n+            }\n+\n+            localIndexMap_.clear();\n+            localIndexMap_.reserve( otherGrid.size( 0 ) );\n+\n+            unsigned int index = 0;\n+            auto localView = otherGrid.leafGridView();\n+            for( auto it = localView.template begin< 0 >(),\n+                 end = localView.template end< 0 >(); it != end; ++it, ++index )\n+            {\n+                const auto element = *it ;\n+                // only store interior element for collection\n+                if( element.partitionType() == Dune :: InteriorEntity )\n+                {\n+                    localIndexMap_.push_back( index );\n+                }\n+            }\n+\n+            // insert send and recv linkage to communicator\n+            toIORankComm_.insertRequest( send, recv );\n+\n+            if( isIORank() )\n+            {\n+                // need an index map for each rank\n+                indexMaps_.clear();\n+                indexMaps_.resize( comm.size() );\n+            }\n+\n+            // distribute global id's to io rank for later association of dof's\n+            DistributeIndexMapping distIndexMapping( globalIndex_, otherGrid.globalCell(), localIndexMap_, indexMaps_ );\n+            toIORankComm_.exchange( distIndexMapping );\n+        }\n+\n+        class PackUnPackSimulatorState : public P2PCommunicatorType::DataHandleInterface\n+        {\n+            const SimulatorState& localState_;\n+            SimulatorState& globalState_;\n+            const WellState& localWellState_;\n+            WellState& globalWellState_;\n+            const IndexMapType& localIndexMap_;\n+            const IndexMapStorageType& indexMaps_;\n+\n+        public:\n+            PackUnPackSimulatorState( const SimulatorState& localState,\n+                                      SimulatorState& globalState,\n+                                      const WellState& localWellState,\n+                                      WellState& globalWellState,\n+                                      const IndexMapType& localIndexMap,\n+                                      const IndexMapStorageType& indexMaps,\n+                                      const bool isIORank )\n+            : localState_( localState ),\n+              globalState_( globalState ),\n+              localWellState_( localWellState ),\n+              globalWellState_( globalWellState ),\n+              localIndexMap_( localIndexMap ),\n+              indexMaps_( indexMaps )\n+            {\n+                if( isIORank )\n+                {\n+                    // add missing data to global state\n+                    for( size_t i=globalState_.cellData().size();\n+                         i<localState.cellData().size(); ++i )\n+                    {\n+                        const size_t components = localState.cellData()[ i ].size() / localState.numCells();\n+                        assert( components * localState.numCells() == localState.cellData()[ i ].size() );\n+                        globalState_.registerCellData( localState.cellDataNames()[ i ], components );\n+                    }\n+\n+                    MessageBufferType buffer;\n+                    pack( 0, buffer );\n+                    // the last index map is the local one\n+                    doUnpack( indexMaps.back(), buffer );\n+                }\n+            }\n+\n+            // pack all data associated with link\n+            void pack( const int link, MessageBufferType& buffer )\n+            {\n+                // we should only get one link\n+                assert( link == 0 );","path":"opm/autodiff/ParallelDebugOutput.hpp","position":346,"original_position":346,"commit_id":"d7f3b8e135ef14465a1716da33d8bedf51bf92ac","original_commit_id":"d7f3b8e135ef14465a1716da33d8bedf51bf92ac","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":"Same issue here as above.","created_at":"2015-09-15T18:05:31Z","updated_at":"2015-09-15T18:05:31Z","html_url":"https://github.com/OPM/opm-autodiff/pull/471#discussion_r39544480","pull_request_url":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471","_links":{"self":{"href":"https://api.github.com/repos/OPM/opm-autodiff/pulls/comments/39544480"},"html":{"href":"https://github.com/OPM/opm-autodiff/pull/471#discussion_r39544480"},"pull_request":{"href":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471"}}},"pull_request":{"url":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471","id":45039441,"html_url":"https://github.com/OPM/opm-autodiff/pull/471","diff_url":"https://github.com/OPM/opm-autodiff/pull/471.diff","patch_url":"https://github.com/OPM/opm-autodiff/pull/471.patch","issue_url":"https://api.github.com/repos/OPM/opm-autodiff/issues/471","number":471,"state":"open","locked":false,"title":"ParallelDebugOutput: make the output in ecl format work in parallel.","user":{"login":"dr-robertk","id":8373576,"avatar_url":"https://avatars.githubusercontent.com/u/8373576?v=3","gravatar_id":"","url":"https://api.github.com/users/dr-robertk","html_url":"https://github.com/dr-robertk","followers_url":"https://api.github.com/users/dr-robertk/followers","following_url":"https://api.github.com/users/dr-robertk/following{/other_user}","gists_url":"https://api.github.com/users/dr-robertk/gists{/gist_id}","starred_url":"https://api.github.com/users/dr-robertk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dr-robertk/subscriptions","organizations_url":"https://api.github.com/users/dr-robertk/orgs","repos_url":"https://api.github.com/users/dr-robertk/repos","events_url":"https://api.github.com/users/dr-robertk/events{/privacy}","received_events_url":"https://api.github.com/users/dr-robertk/received_events","type":"User","site_admin":false},"body":"This PR implements the communication of the distributed data to an I/O rank and therefore allows to use the serial `EclipseWriter`. \r\n\r\nHowever, it is not expected that this technique will scale as the number of cores grow. That is why the name is `ParallelDebugOutput`. This PR depends on OPM/opm-core#882.\r\n\r\n@atgeirr: Could you test the matlab output?","created_at":"2015-09-15T11:50:23Z","updated_at":"2015-09-15T18:05:32Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6c1ff6e113310a7ccdf1dec13f5a8bd2a6c61866","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471/commits","review_comments_url":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471/comments","review_comment_url":"https://api.github.com/repos/OPM/opm-autodiff/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OPM/opm-autodiff/issues/471/comments","statuses_url":"https://api.github.com/repos/OPM/opm-autodiff/statuses/d7f3b8e135ef14465a1716da33d8bedf51bf92ac","head":{"label":"dr-robertk:PR/ParallelDebugOutput","ref":"PR/ParallelDebugOutput","sha":"d7f3b8e135ef14465a1716da33d8bedf51bf92ac","user":{"login":"dr-robertk","id":8373576,"avatar_url":"https://avatars.githubusercontent.com/u/8373576?v=3","gravatar_id":"","url":"https://api.github.com/users/dr-robertk","html_url":"https://github.com/dr-robertk","followers_url":"https://api.github.com/users/dr-robertk/followers","following_url":"https://api.github.com/users/dr-robertk/following{/other_user}","gists_url":"https://api.github.com/users/dr-robertk/gists{/gist_id}","starred_url":"https://api.github.com/users/dr-robertk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dr-robertk/subscriptions","organizations_url":"https://api.github.com/users/dr-robertk/orgs","repos_url":"https://api.github.com/users/dr-robertk/repos","events_url":"https://api.github.com/users/dr-robertk/events{/privacy}","received_events_url":"https://api.github.com/users/dr-robertk/received_events","type":"User","site_admin":false},"repo":{"id":22752626,"name":"opm-autodiff","full_name":"dr-robertk/opm-autodiff","owner":{"login":"dr-robertk","id":8373576,"avatar_url":"https://avatars.githubusercontent.com/u/8373576?v=3","gravatar_id":"","url":"https://api.github.com/users/dr-robertk","html_url":"https://github.com/dr-robertk","followers_url":"https://api.github.com/users/dr-robertk/followers","following_url":"https://api.github.com/users/dr-robertk/following{/other_user}","gists_url":"https://api.github.com/users/dr-robertk/gists{/gist_id}","starred_url":"https://api.github.com/users/dr-robertk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dr-robertk/subscriptions","organizations_url":"https://api.github.com/users/dr-robertk/orgs","repos_url":"https://api.github.com/users/dr-robertk/repos","events_url":"https://api.github.com/users/dr-robertk/events{/privacy}","received_events_url":"https://api.github.com/users/dr-robertk/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dr-robertk/opm-autodiff","description":"Utilities for automatic differentiation and simulators based on AD.","fork":true,"url":"https://api.github.com/repos/dr-robertk/opm-autodiff","forks_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/forks","keys_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/teams","hooks_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/hooks","issue_events_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/issues/events{/number}","events_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/events","assignees_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/assignees{/user}","branches_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/branches{/branch}","tags_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/tags","blobs_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/git/refs{/sha}","trees_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/statuses/{sha}","languages_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/languages","stargazers_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/stargazers","contributors_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/contributors","subscribers_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/subscribers","subscription_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/subscription","commits_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/commits{/sha}","git_commits_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/git/commits{/sha}","comments_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/comments{/number}","issue_comment_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/issues/comments{/number}","contents_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/contents/{+path}","compare_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/merges","archive_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/downloads","issues_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/issues{/number}","pulls_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/pulls{/number}","milestones_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/milestones{/number}","notifications_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/labels{/name}","releases_url":"https://api.github.com/repos/dr-robertk/opm-autodiff/releases{/id}","created_at":"2014-08-08T09:21:15Z","updated_at":"2015-05-08T13:10:31Z","pushed_at":"2015-09-15T13:45:08Z","git_url":"git://github.com/dr-robertk/opm-autodiff.git","ssh_url":"git@github.com:dr-robertk/opm-autodiff.git","clone_url":"https://github.com/dr-robertk/opm-autodiff.git","svn_url":"https://github.com/dr-robertk/opm-autodiff","homepage":null,"size":4097,"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":"OPM:master","ref":"master","sha":"d43b2598860acce5bba9e0a197206735eb504f64","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":10097543,"name":"opm-autodiff","full_name":"OPM/opm-autodiff","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-autodiff","description":"Utilities for automatic differentiation and simulators based on AD.","fork":false,"url":"https://api.github.com/repos/OPM/opm-autodiff","forks_url":"https://api.github.com/repos/OPM/opm-autodiff/forks","keys_url":"https://api.github.com/repos/OPM/opm-autodiff/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OPM/opm-autodiff/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OPM/opm-autodiff/teams","hooks_url":"https://api.github.com/repos/OPM/opm-autodiff/hooks","issue_events_url":"https://api.github.com/repos/OPM/opm-autodiff/issues/events{/number}","events_url":"https://api.github.com/repos/OPM/opm-autodiff/events","assignees_url":"https://api.github.com/repos/OPM/opm-autodiff/assignees{/user}","branches_url":"https://api.github.com/repos/OPM/opm-autodiff/branches{/branch}","tags_url":"https://api.github.com/repos/OPM/opm-autodiff/tags","blobs_url":"https://api.github.com/repos/OPM/opm-autodiff/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OPM/opm-autodiff/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OPM/opm-autodiff/git/refs{/sha}","trees_url":"https://api.github.com/repos/OPM/opm-autodiff/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OPM/opm-autodiff/statuses/{sha}","languages_url":"https://api.github.com/repos/OPM/opm-autodiff/languages","stargazers_url":"https://api.github.com/repos/OPM/opm-autodiff/stargazers","contributors_url":"https://api.github.com/repos/OPM/opm-autodiff/contributors","subscribers_url":"https://api.github.com/repos/OPM/opm-autodiff/subscribers","subscription_url":"https://api.github.com/repos/OPM/opm-autodiff/subscription","commits_url":"https://api.github.com/repos/OPM/opm-autodiff/commits{/sha}","git_commits_url":"https://api.github.com/repos/OPM/opm-autodiff/git/commits{/sha}","comments_url":"https://api.github.com/repos/OPM/opm-autodiff/comments{/number}","issue_comment_url":"https://api.github.com/repos/OPM/opm-autodiff/issues/comments{/number}","contents_url":"https://api.github.com/repos/OPM/opm-autodiff/contents/{+path}","compare_url":"https://api.github.com/repos/OPM/opm-autodiff/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OPM/opm-autodiff/merges","archive_url":"https://api.github.com/repos/OPM/opm-autodiff/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OPM/opm-autodiff/downloads","issues_url":"https://api.github.com/repos/OPM/opm-autodiff/issues{/number}","pulls_url":"https://api.github.com/repos/OPM/opm-autodiff/pulls{/number}","milestones_url":"https://api.github.com/repos/OPM/opm-autodiff/milestones{/number}","notifications_url":"https://api.github.com/repos/OPM/opm-autodiff/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OPM/opm-autodiff/labels{/name}","releases_url":"https://api.github.com/repos/OPM/opm-autodiff/releases{/id}","created_at":"2013-05-16T08:59:22Z","updated_at":"2015-07-28T11:52:29Z","pushed_at":"2015-09-15T13:45:08Z","git_url":"git://github.com/OPM/opm-autodiff.git","ssh_url":"git@github.com:OPM/opm-autodiff.git","clone_url":"https://github.com/OPM/opm-autodiff.git","svn_url":"https://github.com/OPM/opm-autodiff","homepage":null,"size":5534,"stargazers_count":4,"watchers_count":4,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":21,"mirror_url":null,"open_issues_count":22,"forks":21,"open_issues":22,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471"},"html":{"href":"https://github.com/OPM/opm-autodiff/pull/471"},"issue":{"href":"https://api.github.com/repos/OPM/opm-autodiff/issues/471"},"comments":{"href":"https://api.github.com/repos/OPM/opm-autodiff/issues/471/comments"},"review_comments":{"href":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471/comments"},"review_comment":{"href":"https://api.github.com/repos/OPM/opm-autodiff/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OPM/opm-autodiff/pulls/471/commits"},"statuses":{"href":"https://api.github.com/repos/OPM/opm-autodiff/statuses/d7f3b8e135ef14465a1716da33d8bedf51bf92ac"}}}}