{"action":"created","comment":{"url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments/211119200","pull_request_review_id":147474980,"id":211119200,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMTExOTIwMA==","diff_hunk":"@@ -6,15 +6,353 @@\n #include <array>\n #include <cmath>\n #include <cstddef>\n+#include <utility>\n \n+#include \"ApparentHorizons/SpherepackIterator.hpp\"\n #include \"ApparentHorizons/YlmSpherepack.hpp\"\n #include \"DataStructures/DataVector.hpp\"\n+#include \"DataStructures/Matrix.hpp\"\n+#include \"DataStructures/Tensor/EagerMath/DeterminantAndInverse.hpp\"\n #include \"DataStructures/Tensor/EagerMath/DotProduct.hpp\"\n #include \"DataStructures/Tensor/Tensor.hpp\"\n+#include \"NumericalAlgorithms/LinearAlgebra/FindGeneralizedEigenvalues.hpp\"\n+#include \"PointwiseFunctions/GeneralRelativity/Christoffel.hpp\"\n #include \"PointwiseFunctions/GeneralRelativity/IndexManipulation.hpp\"\n #include \"Utilities/ConstantExpressions.hpp\"\n+#include \"Utilities/Gsl.hpp\"\n #include \"Utilities/MakeWithValue.hpp\"\n \n+// IWYU pragma: no_forward_declare Tensor\n+\n+// Functions used by StrahlkorperGr::dimensionful_spin_magnitude\n+namespace {\n+// Find the 2D surface metric by inserting the tangents \\f$\\partial_\\theta\\f$\n+// and \\f$\\partial_\\phi\\f$ into the slots of the 3D spatial metric\n+template <typename Fr>\n+tnsr::ii<DataVector, 2, Frame::Spherical<Fr>> get_surface_metric(\n+    const tnsr::ii<DataVector, 3, Fr>& spatial_metric,\n+    const StrahlkorperTags::StrahlkorperTags_detail::Jacobian<Fr>& tangents,\n+    const Scalar<DataVector>& sin_theta) noexcept {\n+  auto surface_metric =\n+      make_with_value<tnsr::ii<DataVector, 2, Frame::Spherical<Fr>>>(\n+          get<0, 0>(spatial_metric), 0.0);\n+  for (size_t i = 0; i < 3; ++i) {\n+    for (size_t j = 0; j < 3; ++j) {\n+      get<0, 1>(surface_metric) += spatial_metric.get(i, j) *\n+                                   tangents.get(i, 0) * tangents.get(j, 1) *\n+                                   get(sin_theta);\n+    }\n+    // Use symmetry to sum over fewer terms for the 0,0 and 1,1 components\n+    get<0, 0>(surface_metric) +=\n+        spatial_metric.get(i, i) * square(tangents.get(i, 0));\n+    get<1, 1>(surface_metric) += spatial_metric.get(i, i) *\n+                                 square(tangents.get(i, 1)) *\n+                                 square(get(sin_theta));\n+    for (size_t j = i + 1; j < 3; ++j) {\n+      get<0, 0>(surface_metric) += 2.0 * spatial_metric.get(i, j) *\n+                                   tangents.get(i, 0) * tangents.get(j, 0);\n+      get<1, 1>(surface_metric) += 2.0 * spatial_metric.get(i, j) *\n+                                   tangents.get(i, 1) * tangents.get(j, 1) *\n+                                   square(get(sin_theta));\n+    }\n+  }\n+  return surface_metric;\n+}\n+\n+// Compute the trace of Christoffel 2nd kind on the horizon\n+template <typename Fr>\n+tnsr::I<DataVector, 2, Frame::Spherical<Fr>> get_trace_christoffel_second_kind(\n+    const tnsr::ii<DataVector, 2, Frame::Spherical<Fr>>& surface_metric,\n+    const tnsr::II<DataVector, 2, Frame::Spherical<Fr>>& inverse_surface_metric,\n+    const Scalar<DataVector>& sin_theta, const YlmSpherepack& ylm) noexcept {\n+  const Scalar<DataVector> cos_theta{cos(ylm.theta_phi_points()[0])};\n+\n+  // Because the surface metric components are not representable in terms\n+  // of scalar spherical harmonics, you can't naively take first derivatives.\n+  // To avoid potentially large numerical errors, actually differentiate\n+  // square(sin_theta) * the metric component, then\n+  // compute from that the gradient of just the metric component itself.\n+  //\n+  // Note: the method implemented here works with YlmSpherepack but will fail\n+  // for other expansions that, unlike Spherepack, include a collocation\n+  // point at theta = 0. Before switching to such an expansion, first\n+  // reimplement this code to avoid dividing by sin(theta).\n+  //\n+  // Note: YlmSpherepack gradients are flat-space Pfaffian derivatives.\n+  auto grad_surface_metric_theta_theta =\n+      ylm.gradient(square(get(sin_theta)) * get<0, 0>(surface_metric));\n+  get<0>(grad_surface_metric_theta_theta) /= square(get(sin_theta));\n+  get<1>(grad_surface_metric_theta_theta) /= square(get(sin_theta));\n+  get<0>(grad_surface_metric_theta_theta) -=\n+      2.0 * get<0, 0>(surface_metric) * get(cos_theta) / get(sin_theta);\n+\n+  auto grad_surface_metric_theta_phi =\n+      ylm.gradient(get(sin_theta) * get<0, 1>(surface_metric));\n+\n+  get<0>(grad_surface_metric_theta_phi) /= get(sin_theta);\n+  get<1>(grad_surface_metric_theta_phi) /= get(sin_theta);\n+  get<0>(grad_surface_metric_theta_phi) -=\n+      get<0, 1>(surface_metric) * get(cos_theta) / get(sin_theta);\n+\n+  auto grad_surface_metric_phi_phi = ylm.gradient(get<1, 1>(surface_metric));\n+\n+  auto deriv_surface_metric =\n+      make_with_value<tnsr::ijj<DataVector, 2, Frame::Spherical<Fr>>>(\n+          get<0, 0>(surface_metric), 0.0);\n+  // Get the partial derivative of the metric from the Pfaffian derivative\n+  get<0, 0, 0>(deriv_surface_metric) = get<0>(grad_surface_metric_theta_theta);\n+  get<1, 0, 0>(deriv_surface_metric) =\n+      get(sin_theta) * get<1>(grad_surface_metric_theta_theta);\n+  get<0, 0, 1>(deriv_surface_metric) = get<0>(grad_surface_metric_theta_phi);\n+  get<1, 0, 1>(deriv_surface_metric) =\n+      get(sin_theta) * get<1>(grad_surface_metric_theta_phi);\n+  get<0, 1, 1>(deriv_surface_metric) = get<0>(grad_surface_metric_phi_phi);\n+  get<1, 1, 1>(deriv_surface_metric) =\n+      get(sin_theta) * get<1>(grad_surface_metric_phi_phi);\n+\n+  const auto trace_christoffel_second_kind =\n+      trace_last_indices(raise_or_lower_first_index(\n+                             gr::christoffel_first_kind(deriv_surface_metric),\n+                             inverse_surface_metric),\n+                         inverse_surface_metric);\n+\n+  return trace_christoffel_second_kind;\n+}\n+\n+// I'm going to solve a general eigenvalue problem of the form\n+// A x = lambda B x, where A and B are NxN, where N is the\n+// number of elements with l > 0 and l < ntheta - 2,\n+// i.e. l < l_max + 1 - 2 = l_max - 1. This function computes N.\n+size_t get_matrix_dimension(const YlmSpherepack& ylm) noexcept {\n+  // If l_max == m_max, there are square(l_max+1) Ylms total\n+  size_t matrix_dimension = square(ylm.l_max() + 1);\n+  // If l_max > m_max, there are\n+  // (l_max - m_max) * (l_max - m_max + 1) fewer Ylms total\n+  matrix_dimension -=\n+      (ylm.l_max() - ylm.m_max()) * (ylm.l_max() - ylm.m_max() + 1);\n+  // The actual matrix dimension is smaller, because we do not count\n+  // Ylms with l == 0, l == l_max, or l == l_max - 1.\n+  matrix_dimension -= 4 * ylm.m_max() + 3;\n+  if (ylm.l_max() == ylm.m_max()) {\n+    matrix_dimension += 2;\n+  }\n+  return matrix_dimension;\n+}\n+\n+// Get left matrix A and right matrix B for eigenproblem A x = lambda B x.\n+template <typename Fr>\n+void get_left_and_right_eigenproblem_matrices(\n+    const gsl::not_null<Matrix*> left_matrix,\n+    const gsl::not_null<Matrix*> right_matrix,\n+    const tnsr::II<DataVector, 2, Frame::Spherical<Fr>>& inverse_surface_metric,\n+    const tnsr::I<DataVector, 2, Frame::Spherical<Fr>>&\n+        trace_christoffel_second_kind,\n+    const Scalar<DataVector>& sin_theta, const Scalar<DataVector>& ricci_scalar,\n+    const YlmSpherepack& ylm) noexcept {\n+  const auto grad_ricci_scalar = ylm.gradient(get(ricci_scalar));\n+  // loop over all terms with 0<l<l_max-1: each makes a column of\n+  // the matrices for the eigenvalue problem\n+  auto iter_i = SpherepackIterator(ylm.l_max(), ylm.m_max());\n+  auto iter_j = SpherepackIterator(ylm.l_max(), ylm.m_max());\n+  size_t column = 0;  // number which column of the matrix we are filling\n+  for (iter_i.reset(); iter_i; ++iter_i) {","path":"src/ApparentHorizons/StrahlkorperGr.cpp","position":153,"original_position":153,"commit_id":"3619c99d494de73d667a1dc208584908e988a0af","original_commit_id":"3619c99d494de73d667a1dc208584908e988a0af","user":{"login":"geoffrey4444","id":867015,"node_id":"MDQ6VXNlcjg2NzAxNQ==","avatar_url":"https://avatars1.githubusercontent.com/u/867015?v=4","gravatar_id":"","url":"https://api.github.com/users/geoffrey4444","html_url":"https://github.com/geoffrey4444","followers_url":"https://api.github.com/users/geoffrey4444/followers","following_url":"https://api.github.com/users/geoffrey4444/following{/other_user}","gists_url":"https://api.github.com/users/geoffrey4444/gists{/gist_id}","starred_url":"https://api.github.com/users/geoffrey4444/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geoffrey4444/subscriptions","organizations_url":"https://api.github.com/users/geoffrey4444/orgs","repos_url":"https://api.github.com/users/geoffrey4444/repos","events_url":"https://api.github.com/users/geoffrey4444/events{/privacy}","received_events_url":"https://api.github.com/users/geoffrey4444/received_events","type":"User","site_admin":false},"body":"You can, and I will when I commit in response to your comments. \r\n\r\nBefore I factored the code, this was part of a big function where I used a single iterator multiple times to avoid unnecessary allocations. Also, it wasn't clear to me (until today when I closely read the cpp file) that SpherepackIterator's constructor initializes itself, making the reset call unnecessary. \r\n\r\nFinally, note that the reset call sets a single int, so leaving this would not have been a big deal.","created_at":"2018-08-19T23:36:50Z","updated_at":"2018-08-19T23:36:50Z","html_url":"https://github.com/sxs-collaboration/spectre/pull/705#discussion_r211119200","pull_request_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments/211119200"},"html":{"href":"https://github.com/sxs-collaboration/spectre/pull/705#discussion_r211119200"},"pull_request":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705"}},"in_reply_to_id":211115177},"pull_request":{"url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705","id":187903423,"node_id":"MDExOlB1bGxSZXF1ZXN0MTg3OTAzNDIz","html_url":"https://github.com/sxs-collaboration/spectre/pull/705","diff_url":"https://github.com/sxs-collaboration/spectre/pull/705.diff","patch_url":"https://github.com/sxs-collaboration/spectre/pull/705.patch","issue_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/705","number":705,"state":"open","locked":false,"title":"Add Strahlkorper spin magnitude","user":{"login":"geoffrey4444","id":867015,"node_id":"MDQ6VXNlcjg2NzAxNQ==","avatar_url":"https://avatars1.githubusercontent.com/u/867015?v=4","gravatar_id":"","url":"https://api.github.com/users/geoffrey4444","html_url":"https://github.com/geoffrey4444","followers_url":"https://api.github.com/users/geoffrey4444/followers","following_url":"https://api.github.com/users/geoffrey4444/following{/other_user}","gists_url":"https://api.github.com/users/geoffrey4444/gists{/gist_id}","starred_url":"https://api.github.com/users/geoffrey4444/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geoffrey4444/subscriptions","organizations_url":"https://api.github.com/users/geoffrey4444/orgs","repos_url":"https://api.github.com/users/geoffrey4444/repos","events_url":"https://api.github.com/users/geoffrey4444/events{/privacy}","received_events_url":"https://api.github.com/users/geoffrey4444/received_events","type":"User","site_admin":false},"body":"## Proposed changes\r\n\r\nThis pull request computes the approximate-Killing-vector spin magnitude. \r\n\r\nThe approximate symmetries are computed by solving a generalized eigenvalue problem using lapack. Then, the spin is computed as a certain surface integral involving the approximate symmetries and the spin function. \r\n\r\nGiven that this is the most complicated of all of the \"StrahlkorperPhysicalQuantieies\" PRs, I wanted to submit this so reviewers could start looking at, especially to get the big picture, even though the PRs it depends on are still under review.\r\n\r\nThe test uses Mathematica-generated code to compute the Kerr-Schild horizon Ricci scalar curvature, one of the ingredients. This isn't that great, but I couldn't find a better way to get this quantity: it has no simple, analytic expression, and spectre currently can't (as far as I understand) compute it numerically. (Computing numerical derivatives in the volume and then interpolating onto the surface is not yet supported, right?)\r\n\r\n### Types of changes:\r\n\r\n- [ ] Bugfix\r\n- [x] New feature\r\n\r\n### Component:\r\n\r\n- [x] Code\r\n- [ ] Documentation\r\n- [ ] Build system\r\n- [ ] Continuous integration\r\n\r\n### Code review checklist\r\n\r\n- Follows [code review guidelines](https://sxs-collaboration.github.io/spectre/code_review_guide.html)\r\n- Code has documentation and unit tests\r\n- Private member variables have a trailing underscore\r\n- Do not use [Hungarian notation](https://en.wikipedia.org/wiki/Hungarian_notation), e.g. `double* pd_blah` is bad\r\n- Header order:\r\n  1. hpp corresponding to cpp (only in cpp files) or `tests/Unit/TestingFramework.hpp` (only in tests)\r\n  2. Blank line (only in cpp files and tests)\r\n  3. STL and externals (in alphabetical order)\r\n  4. Blank line\r\n  5. SpECTRE includes (in alphabetical order)\r\n- File lists in CMake are alphabetical\r\n- Correct `noexcept` specification for functions (if unsure, mark `noexcept`)\r\n- Mark objects `const` whenever possible\r\n- Almost always `auto`, except with expression templates, i.e. `DataVector`\r\n- All commits for performance changes provide quantitative evidence and the tests used to obtain said evidence.\r\n- Make sure error messages are helpful, e.g. \"The number of grid points in the matrix 'F' is not the same as the number of grid points in the determinant.\"\r\n- Prefix commits addressing PR requests with `fixup`. These commits are flagged\r\n  by Travis so we do not accidentally merge them.\r\n- Include what you use, prefer forward declarations in hpp files.\r\n- Explicitly make numbers floating point, e.g. `2.` or `2.0` over `2`\r\n- Use `Tensor`'s non-member get if the indices are constant expressions, e.g.\r\n  `get<1>(tensor)`\r\n\r\n### Further comments\r\n\r\n<!--\r\nIf this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc...\r\n-->\r\n","created_at":"2018-05-14T17:51:56Z","updated_at":"2018-08-19T23:36:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"49ccfcece027b6efe45e3cc734822333684acc9f","assignee":null,"assignees":[],"requested_reviewers":[{"login":"wthrowe","id":867117,"node_id":"MDQ6VXNlcjg2NzExNw==","avatar_url":"https://avatars1.githubusercontent.com/u/867117?v=4","gravatar_id":"","url":"https://api.github.com/users/wthrowe","html_url":"https://github.com/wthrowe","followers_url":"https://api.github.com/users/wthrowe/followers","following_url":"https://api.github.com/users/wthrowe/following{/other_user}","gists_url":"https://api.github.com/users/wthrowe/gists{/gist_id}","starred_url":"https://api.github.com/users/wthrowe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wthrowe/subscriptions","organizations_url":"https://api.github.com/users/wthrowe/orgs","repos_url":"https://api.github.com/users/wthrowe/repos","events_url":"https://api.github.com/users/wthrowe/events{/privacy}","received_events_url":"https://api.github.com/users/wthrowe/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705/commits","review_comments_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705/comments","review_comment_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/705/comments","statuses_url":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/3619c99d494de73d667a1dc208584908e988a0af","head":{"label":"geoffrey4444:StrahlkorperSpinMagnitude2","ref":"StrahlkorperSpinMagnitude2","sha":"3619c99d494de73d667a1dc208584908e988a0af","user":{"login":"geoffrey4444","id":867015,"node_id":"MDQ6VXNlcjg2NzAxNQ==","avatar_url":"https://avatars1.githubusercontent.com/u/867015?v=4","gravatar_id":"","url":"https://api.github.com/users/geoffrey4444","html_url":"https://github.com/geoffrey4444","followers_url":"https://api.github.com/users/geoffrey4444/followers","following_url":"https://api.github.com/users/geoffrey4444/following{/other_user}","gists_url":"https://api.github.com/users/geoffrey4444/gists{/gist_id}","starred_url":"https://api.github.com/users/geoffrey4444/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geoffrey4444/subscriptions","organizations_url":"https://api.github.com/users/geoffrey4444/orgs","repos_url":"https://api.github.com/users/geoffrey4444/repos","events_url":"https://api.github.com/users/geoffrey4444/events{/privacy}","received_events_url":"https://api.github.com/users/geoffrey4444/received_events","type":"User","site_admin":false},"repo":{"id":107001957,"node_id":"MDEwOlJlcG9zaXRvcnkxMDcwMDE5NTc=","name":"spectre","full_name":"geoffrey4444/spectre","owner":{"login":"geoffrey4444","id":867015,"node_id":"MDQ6VXNlcjg2NzAxNQ==","avatar_url":"https://avatars1.githubusercontent.com/u/867015?v=4","gravatar_id":"","url":"https://api.github.com/users/geoffrey4444","html_url":"https://github.com/geoffrey4444","followers_url":"https://api.github.com/users/geoffrey4444/followers","following_url":"https://api.github.com/users/geoffrey4444/following{/other_user}","gists_url":"https://api.github.com/users/geoffrey4444/gists{/gist_id}","starred_url":"https://api.github.com/users/geoffrey4444/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geoffrey4444/subscriptions","organizations_url":"https://api.github.com/users/geoffrey4444/orgs","repos_url":"https://api.github.com/users/geoffrey4444/repos","events_url":"https://api.github.com/users/geoffrey4444/events{/privacy}","received_events_url":"https://api.github.com/users/geoffrey4444/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/geoffrey4444/spectre","description":null,"fork":true,"url":"https://api.github.com/repos/geoffrey4444/spectre","forks_url":"https://api.github.com/repos/geoffrey4444/spectre/forks","keys_url":"https://api.github.com/repos/geoffrey4444/spectre/keys{/key_id}","collaborators_url":"https://api.github.com/repos/geoffrey4444/spectre/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/geoffrey4444/spectre/teams","hooks_url":"https://api.github.com/repos/geoffrey4444/spectre/hooks","issue_events_url":"https://api.github.com/repos/geoffrey4444/spectre/issues/events{/number}","events_url":"https://api.github.com/repos/geoffrey4444/spectre/events","assignees_url":"https://api.github.com/repos/geoffrey4444/spectre/assignees{/user}","branches_url":"https://api.github.com/repos/geoffrey4444/spectre/branches{/branch}","tags_url":"https://api.github.com/repos/geoffrey4444/spectre/tags","blobs_url":"https://api.github.com/repos/geoffrey4444/spectre/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/geoffrey4444/spectre/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/geoffrey4444/spectre/git/refs{/sha}","trees_url":"https://api.github.com/repos/geoffrey4444/spectre/git/trees{/sha}","statuses_url":"https://api.github.com/repos/geoffrey4444/spectre/statuses/{sha}","languages_url":"https://api.github.com/repos/geoffrey4444/spectre/languages","stargazers_url":"https://api.github.com/repos/geoffrey4444/spectre/stargazers","contributors_url":"https://api.github.com/repos/geoffrey4444/spectre/contributors","subscribers_url":"https://api.github.com/repos/geoffrey4444/spectre/subscribers","subscription_url":"https://api.github.com/repos/geoffrey4444/spectre/subscription","commits_url":"https://api.github.com/repos/geoffrey4444/spectre/commits{/sha}","git_commits_url":"https://api.github.com/repos/geoffrey4444/spectre/git/commits{/sha}","comments_url":"https://api.github.com/repos/geoffrey4444/spectre/comments{/number}","issue_comment_url":"https://api.github.com/repos/geoffrey4444/spectre/issues/comments{/number}","contents_url":"https://api.github.com/repos/geoffrey4444/spectre/contents/{+path}","compare_url":"https://api.github.com/repos/geoffrey4444/spectre/compare/{base}...{head}","merges_url":"https://api.github.com/repos/geoffrey4444/spectre/merges","archive_url":"https://api.github.com/repos/geoffrey4444/spectre/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/geoffrey4444/spectre/downloads","issues_url":"https://api.github.com/repos/geoffrey4444/spectre/issues{/number}","pulls_url":"https://api.github.com/repos/geoffrey4444/spectre/pulls{/number}","milestones_url":"https://api.github.com/repos/geoffrey4444/spectre/milestones{/number}","notifications_url":"https://api.github.com/repos/geoffrey4444/spectre/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/geoffrey4444/spectre/labels{/name}","releases_url":"https://api.github.com/repos/geoffrey4444/spectre/releases{/id}","deployments_url":"https://api.github.com/repos/geoffrey4444/spectre/deployments","created_at":"2017-10-15T10:19:27Z","updated_at":"2018-06-19T16:50:56Z","pushed_at":"2018-08-08T22:50:46Z","git_url":"git://github.com/geoffrey4444/spectre.git","ssh_url":"git@github.com:geoffrey4444/spectre.git","clone_url":"https://github.com/geoffrey4444/spectre.git","svn_url":"https://github.com/geoffrey4444/spectre","homepage":null,"size":8255,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"sxs-collaboration:develop","ref":"develop","sha":"8be65c0f4dd41adc021bef5bd7a0c4f1fdc2528b","user":{"login":"sxs-collaboration","id":26882595,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODgyNTk1","avatar_url":"https://avatars2.githubusercontent.com/u/26882595?v=4","gravatar_id":"","url":"https://api.github.com/users/sxs-collaboration","html_url":"https://github.com/sxs-collaboration","followers_url":"https://api.github.com/users/sxs-collaboration/followers","following_url":"https://api.github.com/users/sxs-collaboration/following{/other_user}","gists_url":"https://api.github.com/users/sxs-collaboration/gists{/gist_id}","starred_url":"https://api.github.com/users/sxs-collaboration/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sxs-collaboration/subscriptions","organizations_url":"https://api.github.com/users/sxs-collaboration/orgs","repos_url":"https://api.github.com/users/sxs-collaboration/repos","events_url":"https://api.github.com/users/sxs-collaboration/events{/privacy}","received_events_url":"https://api.github.com/users/sxs-collaboration/received_events","type":"Organization","site_admin":false},"repo":{"id":87570510,"node_id":"MDEwOlJlcG9zaXRvcnk4NzU3MDUxMA==","name":"spectre","full_name":"sxs-collaboration/spectre","owner":{"login":"sxs-collaboration","id":26882595,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODgyNTk1","avatar_url":"https://avatars2.githubusercontent.com/u/26882595?v=4","gravatar_id":"","url":"https://api.github.com/users/sxs-collaboration","html_url":"https://github.com/sxs-collaboration","followers_url":"https://api.github.com/users/sxs-collaboration/followers","following_url":"https://api.github.com/users/sxs-collaboration/following{/other_user}","gists_url":"https://api.github.com/users/sxs-collaboration/gists{/gist_id}","starred_url":"https://api.github.com/users/sxs-collaboration/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sxs-collaboration/subscriptions","organizations_url":"https://api.github.com/users/sxs-collaboration/orgs","repos_url":"https://api.github.com/users/sxs-collaboration/repos","events_url":"https://api.github.com/users/sxs-collaboration/events{/privacy}","received_events_url":"https://api.github.com/users/sxs-collaboration/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/sxs-collaboration/spectre","description":"SpECTRE is a code for multi-scale, multi-physics problems in astrophysics and gravitational physics.","fork":false,"url":"https://api.github.com/repos/sxs-collaboration/spectre","forks_url":"https://api.github.com/repos/sxs-collaboration/spectre/forks","keys_url":"https://api.github.com/repos/sxs-collaboration/spectre/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sxs-collaboration/spectre/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sxs-collaboration/spectre/teams","hooks_url":"https://api.github.com/repos/sxs-collaboration/spectre/hooks","issue_events_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/events{/number}","events_url":"https://api.github.com/repos/sxs-collaboration/spectre/events","assignees_url":"https://api.github.com/repos/sxs-collaboration/spectre/assignees{/user}","branches_url":"https://api.github.com/repos/sxs-collaboration/spectre/branches{/branch}","tags_url":"https://api.github.com/repos/sxs-collaboration/spectre/tags","blobs_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/refs{/sha}","trees_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/{sha}","languages_url":"https://api.github.com/repos/sxs-collaboration/spectre/languages","stargazers_url":"https://api.github.com/repos/sxs-collaboration/spectre/stargazers","contributors_url":"https://api.github.com/repos/sxs-collaboration/spectre/contributors","subscribers_url":"https://api.github.com/repos/sxs-collaboration/spectre/subscribers","subscription_url":"https://api.github.com/repos/sxs-collaboration/spectre/subscription","commits_url":"https://api.github.com/repos/sxs-collaboration/spectre/commits{/sha}","git_commits_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/commits{/sha}","comments_url":"https://api.github.com/repos/sxs-collaboration/spectre/comments{/number}","issue_comment_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/comments{/number}","contents_url":"https://api.github.com/repos/sxs-collaboration/spectre/contents/{+path}","compare_url":"https://api.github.com/repos/sxs-collaboration/spectre/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sxs-collaboration/spectre/merges","archive_url":"https://api.github.com/repos/sxs-collaboration/spectre/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sxs-collaboration/spectre/downloads","issues_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues{/number}","pulls_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls{/number}","milestones_url":"https://api.github.com/repos/sxs-collaboration/spectre/milestones{/number}","notifications_url":"https://api.github.com/repos/sxs-collaboration/spectre/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sxs-collaboration/spectre/labels{/name}","releases_url":"https://api.github.com/repos/sxs-collaboration/spectre/releases{/id}","deployments_url":"https://api.github.com/repos/sxs-collaboration/spectre/deployments","created_at":"2017-04-07T17:28:20Z","updated_at":"2018-08-17T05:10:53Z","pushed_at":"2018-08-18T08:47:33Z","git_url":"git://github.com/sxs-collaboration/spectre.git","ssh_url":"git@github.com:sxs-collaboration/spectre.git","clone_url":"https://github.com/sxs-collaboration/spectre.git","svn_url":"https://github.com/sxs-collaboration/spectre","homepage":"","size":12792,"stargazers_count":27,"watchers_count":27,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":26,"mirror_url":null,"archived":false,"open_issues_count":110,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":26,"open_issues":110,"watchers":27,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705"},"html":{"href":"https://github.com/sxs-collaboration/spectre/pull/705"},"issue":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/issues/705"},"comments":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/issues/705/comments"},"review_comments":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705/comments"},"review_comment":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/705/commits"},"statuses":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/3619c99d494de73d667a1dc208584908e988a0af"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"geoffrey4444"}}