{"action":"created","comment":{"url":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/comments/175238769","pull_request_review_id":104745113,"id":175238769,"diff_hunk":"@@ -28,413 +31,161 @@\n namespace mfmg\n {\n \n-template <class VectorType>\n-class DealIIOperator\n+namespace dealii_adapter\n {\n-public:\n-  using vector_type = VectorType;\n-\n-public:\n-  virtual void apply(const vector_type &x, vector_type &y) const = 0;\n-\n-  virtual size_t m() const = 0;\n-  virtual size_t n() const = 0;\n-\n-  virtual std::shared_ptr<vector_type> build_domain_vector() const\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n-\n-  virtual std::shared_ptr<vector_type> build_range_vector() const\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n-};\n \n-template <class SparsityPatternType, class MatrixType, class VectorType>\n-class DealIIMatrixOperator : public DealIIOperator<VectorType>\n-{\n-public:\n-  using sparsity_pattern_type = SparsityPatternType;\n-  using matrix_type = MatrixType;\n-  using vector_type = VectorType;\n-  using operator_type =\n-      DealIIMatrixOperator<sparsity_pattern_type, matrix_type, vector_type>;\n-\n-public:\n-  DealIIMatrixOperator(\n-      std::shared_ptr<matrix_type> matrix,\n-      std::shared_ptr<sparsity_pattern_type> sparsity_pattern = nullptr)\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-  }\n-\n-  virtual size_t m() const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return 0;\n-  }\n-\n-  virtual size_t n() const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-    return 0;\n-  }\n-\n-  virtual size_t nnz() const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-    return 0;\n-  }\n-\n-  virtual void apply(const vector_type &x, vector_type &y) const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-  }\n-\n-  std::shared_ptr<operator_type> transpose() const\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n-\n-  std::shared_ptr<operator_type> multiply(const operator_type &operator_b) const\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n-\n-  std::shared_ptr<matrix_type> get_matrix() const\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n-\n-  virtual std::shared_ptr<vector_type>\n-  build_domain_vector() const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n-\n-  virtual std::shared_ptr<vector_type> build_range_vector() const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n-};\n-\n-template <class VectorType>\n-class DealIIMatrixOperator<\n-    dealii::SparsityPattern,\n-    dealii::SparseMatrix<typename VectorType::value_type>, VectorType>\n-    : public DealIIOperator<VectorType>\n+template <typename VectorType>\n+class DealIIMatrixOperator : public Operator<VectorType>\n {\n public:\n   using value_type = typename VectorType::value_type;\n   using sparsity_pattern_type = dealii::SparsityPattern;\n   using matrix_type = dealii::SparseMatrix<value_type>;\n   using vector_type = VectorType;\n-  using operator_type =\n-      DealIIMatrixOperator<sparsity_pattern_type, matrix_type, vector_type>;\n+  using operator_type = Operator<vector_type>;\n \n-public:\n-  DealIIMatrixOperator(\n-      std::shared_ptr<matrix_type> matrix,\n-      std::shared_ptr<sparsity_pattern_type> sparsity_pattern = nullptr)\n-      : _sparsity_pattern(sparsity_pattern), _matrix(matrix)\n-  {\n-  }\n+  DealIIMatrixOperator(std::shared_ptr<matrix_type> matrix,\n+                       std::shared_ptr<sparsity_pattern_type> sparsity_pattern);\n \n   virtual size_t m() const override final { return _matrix->m(); }\n \n   virtual size_t n() const override final { return _matrix->n(); }\n \n   size_t nnz() const { return _matrix->n_nonzero_elements(); }\n \n-  virtual void apply(const vector_type &x, vector_type &y) const override final\n-  {\n-    _matrix->vmult(y, x);\n-  }\n-\n-  std::shared_ptr<operator_type> transpose() const\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n+  virtual void apply(vector_type const &x, vector_type &y) const override final;\n \n-  std::shared_ptr<operator_type> multiply(const operator_type &operator_b) const\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n+  virtual std::shared_ptr<operator_type> transpose() const override final;\n \n-    return nullptr;\n-  }\n+  virtual std::shared_ptr<operator_type>\n+  multiply(operator_type const &operator_b) const override final;\n \n   std::shared_ptr<matrix_type> get_matrix() const { return _matrix; }\n \n   virtual std::shared_ptr<vector_type>\n-  build_domain_vector() const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n+  build_domain_vector() const override final;\n \n-  virtual std::shared_ptr<vector_type> build_range_vector() const override final\n-  {\n-    ASSERT_THROW_NOT_IMPLEMENTED();\n-\n-    return nullptr;\n-  }\n+  virtual std::shared_ptr<vector_type>\n+  build_range_vector() const override final;\n \n private:\n-  // TODO: for some reason, order here is important. If _sparsity_pattern after\n-  // _matrix, it results in some dealii subscriptor throws.\n-  std::shared_ptr<sparsity_pattern_type>\n-      _sparsity_pattern; // this may only be necessary for dealii::SparseMatrix,\n-                         // which does not store the pattern. For Trilinos\n-                         // matrices, this is not needed.\n+  // The sparsity pattern needs to outlive the sparse matrix, so we declare it\n+  // first. This is only necessary for dealii for deal.II sparse matrix.\n+  // Trilinos saves the Epetra_Map inside the sparse matrix.\n+  std::shared_ptr<sparsity_pattern_type> _sparsity_pattern;\n+\n   std::shared_ptr<matrix_type> _matrix;\n };\n \n-template <class VectorType>\n-class DealIIMatrixOperator<dealii::TrilinosWrappers::SparsityPattern,\n-                           dealii::TrilinosWrappers::SparseMatrix, VectorType>\n-    : public DealIIOperator<VectorType>\n+template <typename VectorType>\n+class TrilinosMatrixOperator : public Operator<VectorType>\n {\n public:\n   using value_type = typename VectorType::value_type;\n   using sparsity_pattern_type = dealii::TrilinosWrappers::SparsityPattern;\n   using matrix_type = dealii::TrilinosWrappers::SparseMatrix;\n   using vector_type = VectorType;\n-  using operator_type =\n-      DealIIMatrixOperator<sparsity_pattern_type, matrix_type, vector_type>;\n+  using operator_type = Operator<vector_type>;\n \n-public:\n-  DealIIMatrixOperator(\n+  TrilinosMatrixOperator(\n       std::shared_ptr<matrix_type> matrix,\n-      std::shared_ptr<sparsity_pattern_type> sparsity_pattern = nullptr)\n-      : _sparsity_pattern(sparsity_pattern), _matrix(matrix)\n-  {\n-  }\n+      std::shared_ptr<sparsity_pattern_type> sparsity_pattern = nullptr);\n \n   virtual size_t m() const override final { return _matrix->m(); }\n \n   virtual size_t n() const override final { return _matrix->n(); }\n \n   size_t nnz() const { return _matrix->n_nonzero_elements(); }\n \n-  virtual void apply(const vector_type &x, vector_type &y) const override final\n-  {\n-    _matrix->vmult(y, x);\n-  }\n-\n-  std::shared_ptr<operator_type> transpose() const\n-  {\n-    auto epetra_matrix = _matrix->trilinos_matrix();\n+  virtual void apply(vector_type const &x, vector_type &y) const override final;\n \n-    EpetraExt::RowMatrix_Transpose transposer;\n-    auto transposed_epetra_matrix =\n-        dynamic_cast<Epetra_CrsMatrix &>(transposer(epetra_matrix));\n+  virtual std::shared_ptr<operator_type> transpose() const override final;\n \n-    auto transposed_matrix = std::make_shared<matrix_type>();\n-    transposed_matrix->reinit(transposed_epetra_matrix);\n-\n-    return std::make_shared<operator_type>(transposed_matrix);\n-  }\n-\n-  std::shared_ptr<operator_type> multiply(const operator_type &operator_b) const\n-  {\n-    auto a = this->get_matrix();\n-    auto b = operator_b.get_matrix();\n-\n-    auto c = std::make_shared<matrix_type>();\n-    a->mmult(*c, *b);\n-\n-    return std::make_shared<operator_type>(c);\n-  }\n+  virtual std::shared_ptr<operator_type>\n+  multiply(operator_type const &operator_b) const override final;\n \n   std::shared_ptr<matrix_type> get_matrix() const { return _matrix; }\n \n   virtual std::shared_ptr<vector_type>\n-  build_domain_vector() const override final\n-  {\n-    return std::make_shared<vector_type>(\n-        _matrix->locally_owned_domain_indices(),\n-        _matrix->get_mpi_communicator());\n-  }\n+  build_domain_vector() const override final;\n \n-  std::shared_ptr<vector_type> build_range_vector() const override final\n-  {\n-    return std::make_shared<vector_type>(_matrix->locally_owned_range_indices(),\n-                                         _matrix->get_mpi_communicator());\n-  }\n+  std::shared_ptr<vector_type> build_range_vector() const override final;\n \n private:\n-  // TODO: for some reason, order here is important. If _sparsity_pattern after\n-  // _matrix, it results in some dealii subscriptor throws.\n-  std::shared_ptr<sparsity_pattern_type>\n-      _sparsity_pattern; // this may only be necessary for dealii::SparseMatrix,\n-                         // which does not store the pattern. For Trilinos\n-                         // matrices, this is not needed.\n   std::shared_ptr<matrix_type> _matrix;\n };\n \n-template <class VectorType>\n-class DealIISmootherOperator : public DealIIOperator<VectorType>\n+template <typename VectorType>\n+class SmootherOperator : public Operator<VectorType>\n {\n public:\n   using vector_type = VectorType;\n   using matrix_type = dealii::TrilinosWrappers::SparseMatrix;\n+  using operator_type = Operator<vector_type>;\n \n-private:\n-  enum SmootherType\n-  {\n-    SGS,\n-    GS,\n-    JACOBI,\n-    ILU\n-  };\n-\n-public:\n-  DealIISmootherOperator(const matrix_type &matrix,\n-                         std::shared_ptr<boost::property_tree::ptree> params)\n-      : _matrix(matrix)\n-  {\n-    std::string prec_name = params->get<std::string>(\"preconditioner: type\",\n-                                                     \"Symmetric Gauss-Seidel\");\n-    _prec_type = string2type(prec_name);\n-    initialize(_prec_type);\n-  }\n+  SmootherOperator(matrix_type const &matrix,\n+                   std::shared_ptr<boost::property_tree::ptree> params);\n \n   virtual size_t m() const override final { return _matrix.m(); }\n \n   virtual size_t n() const override final { return _matrix.n(); }\n \n-  void apply(const vector_type &b, vector_type &x) const\n-  {\n-    // r = -(b - Ax)\n-    vector_type r(b);\n-    _matrix.vmult(r, x);\n-    r.add(-1., b);\n-\n-    // x = x + B^{-1} (-r)\n-    vector_type tmp(x);\n-    smoother_vmult(tmp, r);\n-    x.add(-1., tmp);\n-  }\n+  virtual void apply(vector_type const &b, vector_type &x) const override final;\n \n-private:\n-  SmootherType string2type(const std::string &prec_name) const\n-  {\n-    // Make parameters case-insensitive\n-    std::string prec_name_lower = prec_name;\n-    std::transform(prec_name_lower.begin(), prec_name_lower.end(),\n-                   prec_name_lower.begin(), ::tolower);\n-    if (prec_name_lower == \"symmetric gauss-seidel\")\n-      return SGS;\n-    else if (prec_name_lower == \"gauss-seidel\")\n-      return GS;\n-    else if (prec_name_lower == \"jacobi\")\n-      return JACOBI;\n-    else if (prec_name_lower == \"ilu\")\n-      return ILU;\n-    else\n-      throw std::runtime_error(\"Unknown smoother name: \\\"\" + prec_name_lower +\n-                               \"\\\"\");\n-  }\n-  void initialize(const SmootherType prec_type)\n-  {\n-    switch (prec_type)\n-    {\n-    case SGS:\n-      _sgs_smoother.initialize(_matrix);\n-      break;\n-    case GS:\n-      _gs_smoother.initialize(_matrix);\n-      break;\n-    case JACOBI:\n-      _jacobi_smoother.initialize(_matrix);\n-      break;\n-    case ILU:\n-      _ilu_smoother.initialize(_matrix);\n-      break;\n-    };\n-  }\n+  virtual std::shared_ptr<operator_type> transpose() const override final;\n \n-  void smoother_vmult(vector_type &x, const vector_type &b) const\n-  {\n-    {\n-      switch (_prec_type)\n-      {\n-      case SGS:\n-        _sgs_smoother.vmult(x, b);\n-        break;\n-      case GS:\n-        _gs_smoother.vmult(x, b);\n-        break;\n-      case JACOBI:\n-        _jacobi_smoother.vmult(x, b);\n-        break;\n-      case ILU:\n-        _ilu_smoother.vmult(x, b);\n-        break;\n-      };\n-    }\n-  }\n+  virtual std::shared_ptr<operator_type>\n+  multiply(operator_type const &operator_b) const override final;\n+\n+  virtual std::shared_ptr<VectorType>\n+  build_domain_vector() const override final;\n+\n+  virtual std::shared_ptr<VectorType> build_range_vector() const override final;\n \n private:\n-  const matrix_type &_matrix;\n-  SmootherType _prec_type;\n-  dealii::TrilinosWrappers::PreconditionSSOR _sgs_smoother;\n-  dealii::TrilinosWrappers::PreconditionSOR _gs_smoother;\n-  dealii::TrilinosWrappers::PreconditionJacobi _jacobi_smoother;\n-  dealii::TrilinosWrappers::PreconditionILU _ilu_smoother;\n+  void initialize(std::string const &prec_type);\n+\n+  matrix_type const &_matrix;","path":"include/mfmg/dealii_operator.hpp","position":434,"original_position":434,"commit_id":"c26059e07ed20e88ab411b4da89a77b4231d47ce","original_commit_id":"c26059e07ed20e88ab411b4da89a77b4231d47ce","user":{"login":"aprokop","id":7297887,"avatar_url":"https://avatars1.githubusercontent.com/u/7297887?v=4","gravatar_id":"","url":"https://api.github.com/users/aprokop","html_url":"https://github.com/aprokop","followers_url":"https://api.github.com/users/aprokop/followers","following_url":"https://api.github.com/users/aprokop/following{/other_user}","gists_url":"https://api.github.com/users/aprokop/gists{/gist_id}","starred_url":"https://api.github.com/users/aprokop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aprokop/subscriptions","organizations_url":"https://api.github.com/users/aprokop/orgs","repos_url":"https://api.github.com/users/aprokop/repos","events_url":"https://api.github.com/users/aprokop/events{/privacy}","received_events_url":"https://api.github.com/users/aprokop/received_events","type":"User","site_admin":false},"body":"We need to add a comment here. Something like this:\r\n```\r\nCurrently, dealii preconditioners do not support a mode to update a given vector, instead replacing it. For smoothers, this mode is necessary to operator. We workaround this issue by doing extra compuations in `apply`, however this requires residual computation. Therefore, we need to store a reference to matrix.\r\n```","created_at":"2018-03-16T23:59:33Z","updated_at":"2018-03-17T00:02:53Z","html_url":"https://github.com/ORNL-CEES/mfmg/pull/42#discussion_r175238769","pull_request_url":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/comments/175238769"},"html":{"href":"https://github.com/ORNL-CEES/mfmg/pull/42#discussion_r175238769"},"pull_request":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42"}}},"pull_request":{"url":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42","id":175609348,"html_url":"https://github.com/ORNL-CEES/mfmg/pull/42","diff_url":"https://github.com/ORNL-CEES/mfmg/pull/42.diff","patch_url":"https://github.com/ORNL-CEES/mfmg/pull/42.patch","issue_url":"https://api.github.com/repos/ORNL-CEES/mfmg/issues/42","number":42,"state":"open","locked":false,"title":"Operator refactor","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":"The first two commits relates to #37 and are mostly cosmetic. The third commit is more interesting. I have talked with @dalg24 and we thought that the current design was too complicated. This PR removes `DealIIOperator` (which was missing some functions and therefore was not an `Operator` as defined in `concept.hpp`) and it also removes `DealIIMatrixOperator`. Instead of specializing `DealIIMatrixOperator`, we now have classes that derived directly from `Operator`. The classes are `DealIIMatrixOperator` for the `dealii::SparseMatrix` and `TrilinosMatrixOperator` for the `dealii::TrilinosWrappers::SparseMatrix`. This classes are in the `dealii_adapter` namespace and should probably be moved in a `dealii` subdirectory later. The new structure is simpler and allows us to use ETI.","created_at":"2018-03-16T18:13:41Z","updated_at":"2018-03-17T00:02:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1ce05836a37789668e1096a203d163da09ce0dd5","assignee":{"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},"assignees":[{"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}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":751568496,"url":"https://api.github.com/repos/ORNL-CEES/mfmg/labels/in%20progress","name":"in progress","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42/commits","review_comments_url":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42/comments","review_comment_url":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ORNL-CEES/mfmg/issues/42/comments","statuses_url":"https://api.github.com/repos/ORNL-CEES/mfmg/statuses/c26059e07ed20e88ab411b4da89a77b4231d47ce","head":{"label":"Rombur:cuda_hierarchy","ref":"cuda_hierarchy","sha":"c26059e07ed20e88ab411b4da89a77b4231d47ce","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":109394387,"name":"mfmg","full_name":"Rombur/mfmg","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/mfmg","description":null,"fork":true,"url":"https://api.github.com/repos/Rombur/mfmg","forks_url":"https://api.github.com/repos/Rombur/mfmg/forks","keys_url":"https://api.github.com/repos/Rombur/mfmg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Rombur/mfmg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Rombur/mfmg/teams","hooks_url":"https://api.github.com/repos/Rombur/mfmg/hooks","issue_events_url":"https://api.github.com/repos/Rombur/mfmg/issues/events{/number}","events_url":"https://api.github.com/repos/Rombur/mfmg/events","assignees_url":"https://api.github.com/repos/Rombur/mfmg/assignees{/user}","branches_url":"https://api.github.com/repos/Rombur/mfmg/branches{/branch}","tags_url":"https://api.github.com/repos/Rombur/mfmg/tags","blobs_url":"https://api.github.com/repos/Rombur/mfmg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Rombur/mfmg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Rombur/mfmg/git/refs{/sha}","trees_url":"https://api.github.com/repos/Rombur/mfmg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Rombur/mfmg/statuses/{sha}","languages_url":"https://api.github.com/repos/Rombur/mfmg/languages","stargazers_url":"https://api.github.com/repos/Rombur/mfmg/stargazers","contributors_url":"https://api.github.com/repos/Rombur/mfmg/contributors","subscribers_url":"https://api.github.com/repos/Rombur/mfmg/subscribers","subscription_url":"https://api.github.com/repos/Rombur/mfmg/subscription","commits_url":"https://api.github.com/repos/Rombur/mfmg/commits{/sha}","git_commits_url":"https://api.github.com/repos/Rombur/mfmg/git/commits{/sha}","comments_url":"https://api.github.com/repos/Rombur/mfmg/comments{/number}","issue_comment_url":"https://api.github.com/repos/Rombur/mfmg/issues/comments{/number}","contents_url":"https://api.github.com/repos/Rombur/mfmg/contents/{+path}","compare_url":"https://api.github.com/repos/Rombur/mfmg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Rombur/mfmg/merges","archive_url":"https://api.github.com/repos/Rombur/mfmg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Rombur/mfmg/downloads","issues_url":"https://api.github.com/repos/Rombur/mfmg/issues{/number}","pulls_url":"https://api.github.com/repos/Rombur/mfmg/pulls{/number}","milestones_url":"https://api.github.com/repos/Rombur/mfmg/milestones{/number}","notifications_url":"https://api.github.com/repos/Rombur/mfmg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Rombur/mfmg/labels{/name}","releases_url":"https://api.github.com/repos/Rombur/mfmg/releases{/id}","deployments_url":"https://api.github.com/repos/Rombur/mfmg/deployments","created_at":"2017-11-03T12:44:10Z","updated_at":"2017-11-20T21:21:54Z","pushed_at":"2018-03-16T18:17:27Z","git_url":"git://github.com/Rombur/mfmg.git","ssh_url":"git@github.com:Rombur/mfmg.git","clone_url":"https://github.com/Rombur/mfmg.git","svn_url":"https://github.com/Rombur/mfmg","homepage":null,"size":204,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ORNL-CEES:master","ref":"master","sha":"e03ec62dba29ee851ff529f1ee484185a47edfd1","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":109393720,"name":"mfmg","full_name":"ORNL-CEES/mfmg","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/mfmg","description":"MFMG is an open-source library implementing matrix-free multigrid methods.","fork":false,"url":"https://api.github.com/repos/ORNL-CEES/mfmg","forks_url":"https://api.github.com/repos/ORNL-CEES/mfmg/forks","keys_url":"https://api.github.com/repos/ORNL-CEES/mfmg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ORNL-CEES/mfmg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ORNL-CEES/mfmg/teams","hooks_url":"https://api.github.com/repos/ORNL-CEES/mfmg/hooks","issue_events_url":"https://api.github.com/repos/ORNL-CEES/mfmg/issues/events{/number}","events_url":"https://api.github.com/repos/ORNL-CEES/mfmg/events","assignees_url":"https://api.github.com/repos/ORNL-CEES/mfmg/assignees{/user}","branches_url":"https://api.github.com/repos/ORNL-CEES/mfmg/branches{/branch}","tags_url":"https://api.github.com/repos/ORNL-CEES/mfmg/tags","blobs_url":"https://api.github.com/repos/ORNL-CEES/mfmg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ORNL-CEES/mfmg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ORNL-CEES/mfmg/git/refs{/sha}","trees_url":"https://api.github.com/repos/ORNL-CEES/mfmg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ORNL-CEES/mfmg/statuses/{sha}","languages_url":"https://api.github.com/repos/ORNL-CEES/mfmg/languages","stargazers_url":"https://api.github.com/repos/ORNL-CEES/mfmg/stargazers","contributors_url":"https://api.github.com/repos/ORNL-CEES/mfmg/contributors","subscribers_url":"https://api.github.com/repos/ORNL-CEES/mfmg/subscribers","subscription_url":"https://api.github.com/repos/ORNL-CEES/mfmg/subscription","commits_url":"https://api.github.com/repos/ORNL-CEES/mfmg/commits{/sha}","git_commits_url":"https://api.github.com/repos/ORNL-CEES/mfmg/git/commits{/sha}","comments_url":"https://api.github.com/repos/ORNL-CEES/mfmg/comments{/number}","issue_comment_url":"https://api.github.com/repos/ORNL-CEES/mfmg/issues/comments{/number}","contents_url":"https://api.github.com/repos/ORNL-CEES/mfmg/contents/{+path}","compare_url":"https://api.github.com/repos/ORNL-CEES/mfmg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ORNL-CEES/mfmg/merges","archive_url":"https://api.github.com/repos/ORNL-CEES/mfmg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ORNL-CEES/mfmg/downloads","issues_url":"https://api.github.com/repos/ORNL-CEES/mfmg/issues{/number}","pulls_url":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls{/number}","milestones_url":"https://api.github.com/repos/ORNL-CEES/mfmg/milestones{/number}","notifications_url":"https://api.github.com/repos/ORNL-CEES/mfmg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ORNL-CEES/mfmg/labels{/name}","releases_url":"https://api.github.com/repos/ORNL-CEES/mfmg/releases{/id}","deployments_url":"https://api.github.com/repos/ORNL-CEES/mfmg/deployments","created_at":"2017-11-03T12:36:50Z","updated_at":"2018-03-16T01:28:17Z","pushed_at":"2018-03-16T18:13:42Z","git_url":"git://github.com/ORNL-CEES/mfmg.git","ssh_url":"git@github.com:ORNL-CEES/mfmg.git","clone_url":"https://github.com/ORNL-CEES/mfmg.git","svn_url":"https://github.com/ORNL-CEES/mfmg","homepage":"https://mfmg.readthedocs.io","size":189,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":10,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause"},"forks":2,"open_issues":10,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42"},"html":{"href":"https://github.com/ORNL-CEES/mfmg/pull/42"},"issue":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/issues/42"},"comments":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/issues/42/comments"},"review_comments":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42/comments"},"review_comment":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/pulls/42/commits"},"statuses":{"href":"https://api.github.com/repos/ORNL-CEES/mfmg/statuses/c26059e07ed20e88ab411b4da89a77b4231d47ce"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"aprokop"}}