{"action":"created","comment":{"url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/comments/140527327","pull_request_review_id":64617967,"id":140527327,"diff_hunk":"@@ -0,0 +1,669 @@\n+/****************************************************************************\n+ * Copyright (c) 2012-2017 by the DataTransferKit authors                   *\n+ * All rights reserved.                                                     *\n+ *                                                                          *\n+ * This file is part of the DataTransferKit library. DataTransferKit is     *\n+ * distributed under a BSD 3-clause license. For the licensing terms see    *\n+ * the LICENSE file in the top-level directory.                             *\n+ ****************************************************************************/\n+\n+#ifndef DTK_INTERPOLATION_DEF_HPP\n+#define DTK_INTERPOLATION_DEF_HPP\n+\n+#include <DTK_PointInCell.hpp>\n+\n+#include <Teuchos_SerializationTraits.hpp>\n+\n+namespace Teuchos\n+{\n+template <typename Ordinal>\n+class SerializationTraits<Ordinal, DataTransferKit::Point>\n+    : public DirectSerializationTraits<Ordinal, DataTransferKit::Point>\n+{\n+};\n+}\n+\n+namespace DataTransferKit\n+{\n+template <typename DeviceType>\n+Interpolation<DeviceType>::Interpolation(\n+    Teuchos::RCP<const Teuchos::Comm<int>> comm,\n+    Kokkos::View<DTK_CellTopology *, DeviceType> cell_topologies_view,\n+    Kokkos::View<unsigned int *, DeviceType> cells,\n+    Kokkos::View<double **, DeviceType> nodes_coordinates,\n+    Kokkos::View<double **, DeviceType> points_coordinates )\n+    : _apply_allowed( false )\n+    , _comm( comm )\n+    , _distributor( comm )\n+    , _cell_topologies_view( cell_topologies_view )\n+    , _bounding_boxes( \"bounding_boxes\", _cell_topologies_view.extent( 0 ) )\n+    , _bounding_box_to_cell( \"bounding_box_to_cell\",\n+                             _cell_topologies_view.extent( 0 ), DTK_N_TOPO )\n+{\n+\n+    _cell_topologies[0] = shards::getCellTopologyData<shards::Triangle<3>>();\n+    _cell_topologies[1] = shards::getCellTopologyData<shards::Triangle<6>>();\n+    _cell_topologies[2] =\n+        shards::getCellTopologyData<shards::Quadrilateral<4>>();\n+    _cell_topologies[3] =\n+        shards::getCellTopologyData<shards::Quadrilateral<9>>();\n+    _cell_topologies[4] = shards::getCellTopologyData<shards::Tetrahedron<4>>();\n+    _cell_topologies[5] =\n+        shards::getCellTopologyData<shards::Tetrahedron<10>>();\n+    _cell_topologies[6] =\n+        shards::getCellTopologyData<shards::Tetrahedron<11>>();\n+    _cell_topologies[7] = shards::getCellTopologyData<shards::Hexahedron<8>>();\n+    _cell_topologies[8] = shards::getCellTopologyData<shards::Hexahedron<20>>();\n+    _cell_topologies[9] = shards::getCellTopologyData<shards::Hexahedron<27>>();\n+    _cell_topologies[10] = shards::getCellTopologyData<shards::Pyramid<5>>();\n+    _cell_topologies[11] = shards::getCellTopologyData<shards::Pyramid<13>>();\n+    _cell_topologies[12] = shards::getCellTopologyData<shards::Wedge<6>>();\n+    _cell_topologies[13] = shards::getCellTopologyData<shards::Wedge<15>>();\n+    _cell_topologies[14] = shards::getCellTopologyData<shards::Wedge<18>>();\n+\n+    for ( unsigned int topo_id = 0; topo_id < DTK_N_TOPO; ++topo_id )\n+        _n_cells_per_topo[topo_id] = 0;\n+\n+    findReferencePoints( cells, nodes_coordinates, points_coordinates );\n+}\n+\n+template <typename DeviceType>\n+Interpolation<DeviceType>::Interpolation(\n+    Teuchos::RCP<const Teuchos::Comm<int>> comm,\n+    Kokkos::View<DTK_CellTopology *, DeviceType> cell_topologies_view,\n+    Kokkos::View<unsigned int *, DeviceType> cells,\n+    Kokkos::View<double **, DeviceType> nodes_coordinates,\n+    Kokkos::View<double **, DeviceType> points_coordinates,\n+    Kokkos::View<LocalOrdinal *, DeviceType> object_dof_ids )\n+    : Interpolation<DeviceType>( comm, cell_topologies_view, cells,\n+                                 nodes_coordinates, points_coordinates )\n+{\n+    _apply_allowed = true;\n+\n+    // This function does exactly the same thing as convertMesh but for\n+    // object_dof_ids\n+\n+    // Number of nodes for each topology.\n+    // shards objects don't exist on the GPU, so we need to work on the CPU and\n+    // then copy the data back\n+    Kokkos::View<unsigned int[DTK_N_TOPO], DeviceType> n_nodes_per_topo(\n+        \"n_nodes_per_topo\" );\n+    auto n_nodes_per_topo_host = Kokkos::create_mirror_view( n_nodes_per_topo );\n+    for ( int i = 0; i < DTK_N_TOPO; ++i )\n+        n_nodes_per_topo_host( i ) = _cell_topologies[i].getNodeCount();\n+    Kokkos::deep_copy( n_nodes_per_topo, n_nodes_per_topo_host );\n+\n+    // Create an array of Kokkos::View where each View is a block of cells with\n+    // the same topology\n+    for ( int i = 0; i < DTK_N_TOPO; ++i )\n+    {\n+        _block_cells[i] = Kokkos::View<double ***, DeviceType>(\n+            \"block_cells_\" + std::to_string( i ), _n_cells_per_topo[i],\n+            n_nodes_per_topo_host( i ), _dim );\n+    }\n+\n+    // Fill _block_cells from the cells and coordinates\n+    unsigned int const n_cells = _cell_topologies_view.extent( 0 );\n+    Kokkos::View<unsigned int *, DeviceType> nodes_per_cell( \"nodes_per_cell\",\n+                                                             n_cells );\n+    Kokkos::View<DTK_CellTopology *, DeviceType> cell_topo_view =\n+        _cell_topologies_view;\n+    Kokkos::View<unsigned int *, DeviceType> offset( \"offset\", n_cells );\n+    Kokkos::View<unsigned int *, DeviceType> node_offset( \"node_offset\",\n+                                                          n_cells );\n+    computeNodeOffset( n_cells, cell_topo_view, n_nodes_per_topo,\n+                       nodes_per_cell, node_offset );\n+\n+    for ( unsigned int topo_id = 0; topo_id < DTK_N_TOPO; ++topo_id )\n+    {\n+        unsigned int const n_local_cells = _n_cells_per_topo[topo_id];\n+        if ( n_local_cells != 0 )\n+        {\n+            unsigned int const n_nodes_per_topo =\n+                _cell_topologies[topo_id].getNodeCount();\n+            // Assume that the basis functions match the cell topologies\n+            _cell_dofs_ids[topo_id] = Kokkos::View<LocalOrdinal **, DeviceType>(\n+                \"cell_dofs_ids_\" + std::to_string( topo_id ), n_local_cells,\n+                n_nodes_per_topo );\n+\n+            Kokkos::View<LocalOrdinal **, DeviceType> cell_dofs_ids =\n+                _cell_dofs_ids[topo_id];\n+\n+            computeOffset( cell_topologies_view, topo_id, offset );\n+\n+            fillCellDofIds( topo_id, n_cells, n_nodes_per_topo,\n+                            cell_topologies_view, offset, node_offset,\n+                            object_dof_ids, cell_dofs_ids );\n+        }\n+    }\n+}\n+\n+template <typename DeviceType>\n+void Interpolation<DeviceType>::getReferencePoints(\n+    Kokkos::View<DataTransferKit::Point *, DeviceType> &phys_points,\n+    Kokkos::View<DataTransferKit::Point *, DeviceType> &ref_points,\n+    Kokkos::View<bool *, DeviceType> &pt_in_cell )\n+{\n+    // Merge block Kokkos::View in the same order as they were first\n+    // imported. This is necessary to reuse the distributor.\n+    unsigned int n_exported_points = 0;\n+    for ( unsigned int topo_id = 0; topo_id < DTK_N_TOPO; ++topo_id )\n+        n_exported_points += _reference_points[topo_id].extent( 0 );\n+\n+    Kokkos::View<Point *, DeviceType> exported_ref_points(\n+        \"exported_ref_points\", n_exported_points );\n+    Kokkos::View<Point *, DeviceType> exported_phys_points(\n+        \"exported_phys_points\", n_exported_points );\n+    Kokkos::View<bool *, DeviceType> exported_pt_in_cell( \"exported_pt_in_cell\",\n+                                                          n_exported_points );\n+    unsigned int dim = _dim;\n+    for ( unsigned int topo_id = 0; topo_id < DTK_N_TOPO; ++topo_id )\n+    {\n+        Kokkos::View<unsigned int *, DeviceType> map =\n+            _point_indices_map[topo_id];\n+        Kokkos::View<double **, DeviceType> reference_points =\n+            _reference_points[topo_id];\n+        Kokkos::View<double **, DeviceType> phys_points =\n+            _filtered_points[topo_id];\n+        Kokkos::View<bool *, DeviceType> point_in_cell =\n+            _point_in_cell[topo_id];\n+        using ExecutionSpace = typename DeviceType::execution_space;\n+        unsigned int const n_topo_points = reference_points.extent( 0 );\n+        Kokkos::parallel_for(\n+            REGION_NAME( \"merge_block_view\" ),\n+            Kokkos::RangePolicy<ExecutionSpace>( 0, n_topo_points ),\n+            KOKKOS_LAMBDA( int const i ) {\n+                for ( unsigned int d = 0; d < dim; ++d )\n+                {\n+                    exported_ref_points( map( i ) )[d] =\n+                        reference_points( i, d );\n+                    exported_phys_points( map( i ) )[d] = phys_points( i, d );\n+                }\n+                exported_pt_in_cell( map( i ) ) = point_in_cell( i );\n+            } );\n+        Kokkos::fence();\n+    }\n+\n+    // Communicate the results back to the calling processors\n+    unsigned int n_imports = _distributor.getTotalReceiveLength();\n+    Kokkos::realloc( phys_points, n_imports );\n+    Kokkos::realloc( ref_points, n_imports );\n+    Kokkos::realloc( pt_in_cell, n_imports );\n+\n+    DataTransferKit::DistributedSearchTreeImpl<DeviceType>::sendAcrossNetwork(\n+        _distributor, exported_phys_points, phys_points );\n+    DataTransferKit::DistributedSearchTreeImpl<DeviceType>::sendAcrossNetwork(\n+        _distributor, exported_ref_points, ref_points );\n+    DataTransferKit::DistributedSearchTreeImpl<DeviceType>::sendAcrossNetwork(\n+        _distributor, exported_pt_in_cell, pt_in_cell );\n+}\n+\n+template <typename DeviceType>\n+void Interpolation<DeviceType>::convertMesh(\n+    Kokkos::View<unsigned int *, DeviceType> cells,\n+    Kokkos::View<double **, DeviceType> coordinates )\n+{\n+    // First, we get the number of nodes for each topology to get initialize\n+    // _block_cells at the right size.\n+    // shards objects don't exist on the GPU, so we need to work on the CPU and\n+    // then copy the data back\n+    Kokkos::View<unsigned int[DTK_N_TOPO], DeviceType> n_nodes_per_topo(\n+        \"n_nodes_per_topo\" );\n+    auto n_nodes_per_topo_host = Kokkos::create_mirror_view( n_nodes_per_topo );\n+    for ( int i = 0; i < DTK_N_TOPO; ++i )\n+        n_nodes_per_topo_host( i ) = _cell_topologies[i].getNodeCount();\n+    Kokkos::deep_copy( n_nodes_per_topo, n_nodes_per_topo_host );\n+\n+    // Create an array of Kokkos::View where each View is a block of cells with\n+    // the same topology\n+    for ( int i = 0; i < DTK_N_TOPO; ++i )\n+    {\n+        _block_cells[i] = Kokkos::View<double ***, DeviceType>(\n+            \"block_cells_\" + std::to_string( i ), _n_cells_per_topo[i],\n+            n_nodes_per_topo_host( i ), _dim );\n+    }\n+\n+    // Compute the offset associated to each cell in the coordinates View.\n+    unsigned int const n_cells = _cell_topologies_view.extent( 0 );\n+    Kokkos::View<unsigned int *, DeviceType> nodes_per_cell( \"nodes_per_cell\",\n+                                                             n_cells );\n+    Kokkos::View<DTK_CellTopology *, DeviceType> cell_topo_view =\n+        _cell_topologies_view;\n+    Kokkos::View<unsigned int *, DeviceType> node_offset( \"node_offset\",\n+                                                          n_cells );\n+    computeNodeOffset( n_cells, cell_topo_view, n_nodes_per_topo,\n+                       nodes_per_cell, node_offset );\n+\n+    using ExecutionSpace = typename DeviceType::execution_space;\n+    Kokkos::View<unsigned int *, DeviceType> offset( \"offset\", n_cells );\n+    unsigned int const dim = _dim;\n+    Kokkos::View<DataTransferKit::Box *, DeviceType> bounding_boxes =\n+        _bounding_boxes;\n+    Kokkos::View<unsigned int **, DeviceType> bounding_box_to_cell =\n+        _bounding_box_to_cell;\n+    for ( unsigned int topo_id = 0; topo_id < DTK_N_TOPO; ++topo_id )\n+    {\n+        // Compute the relatvive position of each cell of a given topology\n+        computeOffset( cell_topo_view, topo_id, offset );\n+\n+        // Fill _block_cell and create the bounding boxes from _block_cells\n+        Kokkos::View<double ***, DeviceType> block_cells =\n+            _block_cells[topo_id];\n+        Kokkos::parallel_for(\n+            REGION_NAME( \"fill_block_cell_\" + std::to_string( topo_id ) ),\n+            Kokkos::RangePolicy<ExecutionSpace>( 0, n_cells ),\n+            KOKKOS_LAMBDA( int const i ) {\n+                if ( cell_topo_view( i ) == topo_id )\n+                {\n+                    DataTransferKit::Box bounding_box;\n+                    // If dim == 2, we need to set bounding_box[4] and\n+                    // bounding_box[5].\n+                    if ( dim == 2 )\n+                    {\n+                        bounding_box[4] = 0;\n+                        bounding_box[5] = 1;\n+                    }\n+                    unsigned int const k = offset( i );\n+                    unsigned int const n_nodes = n_nodes_per_topo( topo_id );\n+                    for ( unsigned int node = 0; node < n_nodes; ++node )\n+                    {\n+                        unsigned int const n = node_offset( i ) + node;\n+                        for ( unsigned int d = 0; d < dim; ++d )\n+                        {\n+                            // Copy the coordinated in block_cells\n+                            block_cells( k, node, d ) =\n+                                coordinates( cells( n ), d );\n+                            // Build the bounding box.\n+                            if ( block_cells( k, node, d ) <\n+                                 bounding_box[d * 2] )\n+                                bounding_box[d * 2] = block_cells( k, node, d );\n+                            if ( block_cells( k, node, d ) >\n+                                 bounding_box[d * 2 + 1] )\n+                                bounding_box[d * 2 + 1] =\n+                                    block_cells( k, node, d );\n+                        }\n+                    }\n+                    bounding_boxes( i ) = bounding_box;\n+                    bounding_box_to_cell( i, topo_id ) = k;\n+                }\n+            } );\n+        Kokkos::fence();\n+    }\n+}\n+\n+template <typename DeviceType>\n+void Interpolation<DeviceType>::performDistributedSearch(\n+    Kokkos::View<double **, DeviceType> points_coord,\n+    Kokkos::View<DataTransferKit::Point *, DeviceType> &imported_points,\n+    Kokkos::View<int *, DeviceType> &imported_query_ids,\n+    Kokkos::View<int *, DeviceType> &imported_cell_indices )\n+{\n+    DataTransferKit::DistributedSearchTree<DeviceType> distributed_tree(\n+        _comm, _bounding_boxes );\n+\n+    unsigned int const n_points = points_coord.extent( 0 );\n+\n+    // Build the queries\n+    // FIXME do not use Within predicate because it requires a radius, i.e., it\n+    // is mesh dependent\n+    using ExecutionSpace = typename DeviceType::execution_space;\n+    Kokkos::View<DataTransferKit::Details::Within *, DeviceType> queries(\n+        \"queries\", n_points );\n+    Kokkos::parallel_for( \"register_queries\",\n+                          Kokkos::RangePolicy<ExecutionSpace>( 0, n_points ),\n+                          KOKKOS_LAMBDA( int i ) {\n+                              queries( i ) = DataTransferKit::Details::within(\n+                                  {{points_coord( i, 0 ), points_coord( i, 1 ),\n+                                    points_coord( i, 2 )}},\n+                                  1e-14 );\n+                          } );\n+    Kokkos::fence();\n+\n+    // Perform the distributed search\n+    Kokkos::View<int *, DeviceType> indices( \"indices\" );\n+    Kokkos::View<int *, DeviceType> offset( \"offset\" );\n+    Kokkos::View<int *, DeviceType> ranks( \"ranks\" );\n+    distributed_tree.query( queries, indices, offset, ranks );\n+\n+    // Create the distributor and its reverse that will be used to communicate\n+    // the results back to the calling processors.\n+    auto ranks_host = Kokkos::create_mirror_view( ranks );\n+    Kokkos::deep_copy( ranks_host, ranks );\n+    Tpetra::Distributor distributed_search_distributor( _comm );\n+    unsigned int const n_imports =\n+        distributed_search_distributor.createFromSends(\n+            Teuchos::ArrayView<int const>( ranks_host.data(),\n+                                           ranks_host.extent( 0 ) ) );\n+\n+    // Communicate cell indices\n+    Kokkos::realloc( imported_cell_indices, n_imports );\n+    DataTransferKit::DistributedSearchTreeImpl<DeviceType>::sendAcrossNetwork(\n+        distributed_search_distributor, indices, imported_cell_indices );\n+    // Duplicate the points_coord for the communication. Duplicating the points\n+    // allows us to use the same distributor.\n+    unsigned int const indices_size = indices.extent( 0 );\n+    Kokkos::View<DataTransferKit::Point *, DeviceType> exported_points(\n+        \"exported_points\", indices_size );\n+    Kokkos::View<int *, DeviceType> exported_query_ids( \"exported_query_ids\",\n+                                                        indices_size );\n+    if ( offset.extent( 0 ) > 0 )","path":"packages/Discretization/src/DTK_Interpolation_def.hpp","position":349,"original_position":349,"commit_id":"e8cd923ddc065ef62eb47b115ff3424eaa5735e7","original_commit_id":"e8cd923ddc065ef62eb47b115ff3424eaa5735e7","user":{"login":"dalg24","id":296978,"avatar_url":"https://avatars0.githubusercontent.com/u/296978?v=4","gravatar_id":"","url":"https://api.github.com/users/dalg24","html_url":"https://github.com/dalg24","followers_url":"https://api.github.com/users/dalg24/followers","following_url":"https://api.github.com/users/dalg24/following{/other_user}","gists_url":"https://api.github.com/users/dalg24/gists{/gist_id}","starred_url":"https://api.github.com/users/dalg24/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dalg24/subscriptions","organizations_url":"https://api.github.com/users/dalg24/orgs","repos_url":"https://api.github.com/users/dalg24/repos","events_url":"https://api.github.com/users/dalg24/events{/privacy}","received_events_url":"https://api.github.com/users/dalg24/received_events","type":"User","site_admin":false},"body":"Per #305 you can get rid of it.","created_at":"2017-09-22T15:40:24Z","updated_at":"2017-09-22T15:40:24Z","html_url":"https://github.com/ORNL-CEES/DataTransferKit/pull/303#discussion_r140527327","pull_request_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/comments/140527327"},"html":{"href":"https://github.com/ORNL-CEES/DataTransferKit/pull/303#discussion_r140527327"},"pull_request":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303"}},"in_reply_to_id":140097401},"pull_request":{"url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303","id":141375754,"html_url":"https://github.com/ORNL-CEES/DataTransferKit/pull/303","diff_url":"https://github.com/ORNL-CEES/DataTransferKit/pull/303.diff","patch_url":"https://github.com/ORNL-CEES/DataTransferKit/pull/303.patch","issue_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/issues/303","number":303,"state":"open","locked":false,"title":"Add Interpolation","user":{"login":"Rombur","id":368538,"avatar_url":"https://avatars3.githubusercontent.com/u/368538?v=4","gravatar_id":"","url":"https://api.github.com/users/Rombur","html_url":"https://github.com/Rombur","followers_url":"https://api.github.com/users/Rombur/followers","following_url":"https://api.github.com/users/Rombur/following{/other_user}","gists_url":"https://api.github.com/users/Rombur/gists{/gist_id}","starred_url":"https://api.github.com/users/Rombur/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Rombur/subscriptions","organizations_url":"https://api.github.com/users/Rombur/orgs","repos_url":"https://api.github.com/users/Rombur/repos","events_url":"https://api.github.com/users/Rombur/events{/privacy}","received_events_url":"https://api.github.com/users/Rombur/received_events","type":"User","site_admin":false},"body":"This PR adds supports for matrix-free Interpolation (relates to #280). The code should have been pretty simple given the already existing capabilities (interface, distributed search, and point in cell) but unfortunately it is not because of the different data structures used by these building blocks. Most of this PR consist of glue code that changes the data structures and of code that keeps track of where the values are (MPI communications and change of data structures means that all the data are reordered several times). There are two different constructors. The first ones allows you to get the position of points in the reference frame. The second constructor also allows you to the interpolation. I strongly advise you to read the PR in the following order the first time:\r\n 1. First [constructor](https://github.com/Rombur/DataTransferKit/blob/integration/packages/Discretization/src/DTK_Interpolation_def.hpp#L29)\r\n 2. [findReferencePoints](https://github.com/Rombur/DataTransferKit/blob/integration/packages/Discretization/src/DTK_Interpolation_def.hpp#L449)\r\n 3. [getReferencePoints](https://github.com/Rombur/DataTransferKit/blob/integration/packages/Discretization/src/DTK_Interpolation_def.hpp#L142)\r\n 4. Second [constructor](https://github.com/Rombur/DataTransferKit/blob/integration/packages/Discretization/src/DTK_Interpolation_def.hpp#L71)\r\n 5. [apply](https://github.com/Rombur/DataTransferKit/blob/integration/packages/Discretization/src/DTK_Interpolation_decl.hpp#L84)\r\n\r\nThis will give you a global idea of how everything works.\r\n\r\nFor the tests, the first two functions don't do anything interesting but building two different meshes. The first one is made of simple hex while the second one is mixed topology of triangles and quad. The following four functions are the real tests.","created_at":"2017-09-15T18:40:56Z","updated_at":"2017-09-22T15:40:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"60bae404e3e83095f34016f47f926cc1b9a57af7","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303/commits","review_comments_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303/comments","review_comment_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/issues/303/comments","statuses_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/statuses/e8cd923ddc065ef62eb47b115ff3424eaa5735e7","head":{"label":"Rombur:integration","ref":"integration","sha":"e8cd923ddc065ef62eb47b115ff3424eaa5735e7","user":{"login":"Rombur","id":368538,"avatar_url":"https://avatars3.githubusercontent.com/u/368538?v=4","gravatar_id":"","url":"https://api.github.com/users/Rombur","html_url":"https://github.com/Rombur","followers_url":"https://api.github.com/users/Rombur/followers","following_url":"https://api.github.com/users/Rombur/following{/other_user}","gists_url":"https://api.github.com/users/Rombur/gists{/gist_id}","starred_url":"https://api.github.com/users/Rombur/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Rombur/subscriptions","organizations_url":"https://api.github.com/users/Rombur/orgs","repos_url":"https://api.github.com/users/Rombur/repos","events_url":"https://api.github.com/users/Rombur/events{/privacy}","received_events_url":"https://api.github.com/users/Rombur/received_events","type":"User","site_admin":false},"repo":{"id":55541032,"name":"DataTransferKit","full_name":"Rombur/DataTransferKit","owner":{"login":"Rombur","id":368538,"avatar_url":"https://avatars3.githubusercontent.com/u/368538?v=4","gravatar_id":"","url":"https://api.github.com/users/Rombur","html_url":"https://github.com/Rombur","followers_url":"https://api.github.com/users/Rombur/followers","following_url":"https://api.github.com/users/Rombur/following{/other_user}","gists_url":"https://api.github.com/users/Rombur/gists{/gist_id}","starred_url":"https://api.github.com/users/Rombur/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Rombur/subscriptions","organizations_url":"https://api.github.com/users/Rombur/orgs","repos_url":"https://api.github.com/users/Rombur/repos","events_url":"https://api.github.com/users/Rombur/events{/privacy}","received_events_url":"https://api.github.com/users/Rombur/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Rombur/DataTransferKit","description":"A library for multiphysics solution transfer.","fork":true,"url":"https://api.github.com/repos/Rombur/DataTransferKit","forks_url":"https://api.github.com/repos/Rombur/DataTransferKit/forks","keys_url":"https://api.github.com/repos/Rombur/DataTransferKit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Rombur/DataTransferKit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Rombur/DataTransferKit/teams","hooks_url":"https://api.github.com/repos/Rombur/DataTransferKit/hooks","issue_events_url":"https://api.github.com/repos/Rombur/DataTransferKit/issues/events{/number}","events_url":"https://api.github.com/repos/Rombur/DataTransferKit/events","assignees_url":"https://api.github.com/repos/Rombur/DataTransferKit/assignees{/user}","branches_url":"https://api.github.com/repos/Rombur/DataTransferKit/branches{/branch}","tags_url":"https://api.github.com/repos/Rombur/DataTransferKit/tags","blobs_url":"https://api.github.com/repos/Rombur/DataTransferKit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Rombur/DataTransferKit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Rombur/DataTransferKit/git/refs{/sha}","trees_url":"https://api.github.com/repos/Rombur/DataTransferKit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Rombur/DataTransferKit/statuses/{sha}","languages_url":"https://api.github.com/repos/Rombur/DataTransferKit/languages","stargazers_url":"https://api.github.com/repos/Rombur/DataTransferKit/stargazers","contributors_url":"https://api.github.com/repos/Rombur/DataTransferKit/contributors","subscribers_url":"https://api.github.com/repos/Rombur/DataTransferKit/subscribers","subscription_url":"https://api.github.com/repos/Rombur/DataTransferKit/subscription","commits_url":"https://api.github.com/repos/Rombur/DataTransferKit/commits{/sha}","git_commits_url":"https://api.github.com/repos/Rombur/DataTransferKit/git/commits{/sha}","comments_url":"https://api.github.com/repos/Rombur/DataTransferKit/comments{/number}","issue_comment_url":"https://api.github.com/repos/Rombur/DataTransferKit/issues/comments{/number}","contents_url":"https://api.github.com/repos/Rombur/DataTransferKit/contents/{+path}","compare_url":"https://api.github.com/repos/Rombur/DataTransferKit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Rombur/DataTransferKit/merges","archive_url":"https://api.github.com/repos/Rombur/DataTransferKit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Rombur/DataTransferKit/downloads","issues_url":"https://api.github.com/repos/Rombur/DataTransferKit/issues{/number}","pulls_url":"https://api.github.com/repos/Rombur/DataTransferKit/pulls{/number}","milestones_url":"https://api.github.com/repos/Rombur/DataTransferKit/milestones{/number}","notifications_url":"https://api.github.com/repos/Rombur/DataTransferKit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Rombur/DataTransferKit/labels{/name}","releases_url":"https://api.github.com/repos/Rombur/DataTransferKit/releases{/id}","deployments_url":"https://api.github.com/repos/Rombur/DataTransferKit/deployments","created_at":"2016-04-05T19:55:04Z","updated_at":"2016-04-05T19:55:06Z","pushed_at":"2017-09-19T12:57:18Z","git_url":"git://github.com/Rombur/DataTransferKit.git","ssh_url":"git@github.com:Rombur/DataTransferKit.git","clone_url":"https://github.com/Rombur/DataTransferKit.git","svn_url":"https://github.com/Rombur/DataTransferKit","homepage":"ORNL-CEES.github.io/DataTransferKit","size":16730,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ORNL-CEES:master","ref":"master","sha":"0b1d7387ad1d580d264c0c0de2a464ab107431ca","user":{"login":"ORNL-CEES","id":6653148,"avatar_url":"https://avatars0.githubusercontent.com/u/6653148?v=4","gravatar_id":"","url":"https://api.github.com/users/ORNL-CEES","html_url":"https://github.com/ORNL-CEES","followers_url":"https://api.github.com/users/ORNL-CEES/followers","following_url":"https://api.github.com/users/ORNL-CEES/following{/other_user}","gists_url":"https://api.github.com/users/ORNL-CEES/gists{/gist_id}","starred_url":"https://api.github.com/users/ORNL-CEES/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ORNL-CEES/subscriptions","organizations_url":"https://api.github.com/users/ORNL-CEES/orgs","repos_url":"https://api.github.com/users/ORNL-CEES/repos","events_url":"https://api.github.com/users/ORNL-CEES/events{/privacy}","received_events_url":"https://api.github.com/users/ORNL-CEES/received_events","type":"Organization","site_admin":false},"repo":{"id":25265743,"name":"DataTransferKit","full_name":"ORNL-CEES/DataTransferKit","owner":{"login":"ORNL-CEES","id":6653148,"avatar_url":"https://avatars0.githubusercontent.com/u/6653148?v=4","gravatar_id":"","url":"https://api.github.com/users/ORNL-CEES","html_url":"https://github.com/ORNL-CEES","followers_url":"https://api.github.com/users/ORNL-CEES/followers","following_url":"https://api.github.com/users/ORNL-CEES/following{/other_user}","gists_url":"https://api.github.com/users/ORNL-CEES/gists{/gist_id}","starred_url":"https://api.github.com/users/ORNL-CEES/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ORNL-CEES/subscriptions","organizations_url":"https://api.github.com/users/ORNL-CEES/orgs","repos_url":"https://api.github.com/users/ORNL-CEES/repos","events_url":"https://api.github.com/users/ORNL-CEES/events{/privacy}","received_events_url":"https://api.github.com/users/ORNL-CEES/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ORNL-CEES/DataTransferKit","description":"A library for multiphysics solution transfer.","fork":false,"url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit","forks_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/forks","keys_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/teams","hooks_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/hooks","issue_events_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/issues/events{/number}","events_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/events","assignees_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/assignees{/user}","branches_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/branches{/branch}","tags_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/tags","blobs_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/git/refs{/sha}","trees_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/statuses/{sha}","languages_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/languages","stargazers_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/stargazers","contributors_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/contributors","subscribers_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/subscribers","subscription_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/subscription","commits_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/commits{/sha}","git_commits_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/git/commits{/sha}","comments_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/comments{/number}","issue_comment_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/issues/comments{/number}","contents_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/contents/{+path}","compare_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/merges","archive_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/downloads","issues_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/issues{/number}","pulls_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls{/number}","milestones_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/milestones{/number}","notifications_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/labels{/name}","releases_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/releases{/id}","deployments_url":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/deployments","created_at":"2014-10-15T17:35:07Z","updated_at":"2017-06-27T14:04:28Z","pushed_at":"2017-09-22T15:37:58Z","git_url":"git://github.com/ORNL-CEES/DataTransferKit.git","ssh_url":"git@github.com:ORNL-CEES/DataTransferKit.git","clone_url":"https://github.com/ORNL-CEES/DataTransferKit.git","svn_url":"https://github.com/ORNL-CEES/DataTransferKit","homepage":"https://ornl-cees.github.io/DataTransferKit","size":16692,"stargazers_count":16,"watchers_count":16,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":14,"mirror_url":null,"open_issues_count":40,"forks":14,"open_issues":40,"watchers":16,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303"},"html":{"href":"https://github.com/ORNL-CEES/DataTransferKit/pull/303"},"issue":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/issues/303"},"comments":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/issues/303/comments"},"review_comments":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303/comments"},"review_comment":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/pulls/303/commits"},"statuses":{"href":"https://api.github.com/repos/ORNL-CEES/DataTransferKit/statuses/e8cd923ddc065ef62eb47b115ff3424eaa5735e7"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"dalg24"}}