From ee8771b188ade74bbd0df947b11ff60566a1bc86 Mon Sep 17 00:00:00 2001 From: JonathanGorard Date: Mon, 6 May 2024 09:53:09 -0400 Subject: [PATCH] Added spatial and spacetime Weyl tensor computations (e.g. for potential future work on gravitational wave extraction) for both Minkowski and black hole spacetimes, plus updated unit test to confirm that (a) Minkowski space is conformally-flat; and (b) in black hole spacetimes, the Riemann and Weyl tensors are equal. --- unit/ctest_gr_spacetime.c | 156 +++++++++++++++++++++++++++++++++- zero/gkyl_gr_blackhole.h | 37 ++++++++ zero/gkyl_gr_minkowski.h | 37 ++++++++ zero/gkyl_gr_spacetime.h | 48 +++++++++++ zero/gkyl_gr_spacetime_diff.h | 39 ++++++++- zero/gr_blackhole.c | 17 ++++ zero/gr_minkowski.c | 33 +++++++ zero/gr_spacetime.c | 14 +++ zero/gr_spacetime_diff.c | 134 +++++++++++++++++++++++++++++ 9 files changed, 512 insertions(+), 3 deletions(-) diff --git a/unit/ctest_gr_spacetime.c b/unit/ctest_gr_spacetime.c index 51c554b60..6f805027f 100644 --- a/unit/ctest_gr_spacetime.c +++ b/unit/ctest_gr_spacetime.c @@ -163,23 +163,28 @@ test_gr_minkowski() } double ****spatial_riemann_tensor = gkyl_malloc(sizeof(double***[3])); + double ****spatial_weyl_tensor = gkyl_malloc(sizeof(double***[3])); double **spatial_ricci_tensor = gkyl_malloc(sizeof(double*[3])); double spatial_ricci_scalar; for (int i = 0; i < 3; i++) { spatial_riemann_tensor[i] = gkyl_malloc(sizeof(double**[3])); + spatial_weyl_tensor[i] = gkyl_malloc(sizeof(double**[3])); spatial_ricci_tensor[i] = gkyl_malloc(sizeof(double[3])); for (int j = 0; j < 3; j++) { spatial_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[3])); + spatial_weyl_tensor[i][j] = gkyl_malloc(sizeof(double*[3])); for (int k = 0; k < 3; k++) { - spatial_riemann_tensor[i][j][k] = malloc(sizeof(double[3])); + spatial_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[3])); + spatial_weyl_tensor[i][j][k] = gkyl_malloc(sizeof(double[3])); } } } spacetime->spatial_riemann_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spatial_riemann_tensor); + spacetime->spatial_weyl_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spatial_weyl_tensor); spacetime->spatial_ricci_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spatial_ricci_tensor); spacetime->spatial_ricci_scalar_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spatial_ricci_scalar); @@ -190,6 +195,7 @@ test_gr_minkowski() for (int k = 0; k < 3; k++) { for (int l = 0; l < 3; l++) { TEST_CHECK( gkyl_compare(spatial_riemann_tensor[i][j][k][l], 0.0, 1e-10) ); + TEST_CHECK( gkyl_compare(spatial_weyl_tensor[i][j][k][l], 0.0, 1e-10) ); } } } @@ -198,23 +204,28 @@ test_gr_minkowski() TEST_CHECK( gkyl_compare(spatial_ricci_scalar, 0.0, 1e-10) ); double ****spacetime_riemann_tensor = gkyl_malloc(sizeof(double***[4])); + double ****spacetime_weyl_tensor = gkyl_malloc(sizeof(double***[4])); double **spacetime_ricci_tensor = gkyl_malloc(sizeof(double*[4])); double spacetime_ricci_scalar; for (int i = 0; i < 4; i++) { spacetime_riemann_tensor[i] = gkyl_malloc(sizeof(double**[4])); + spacetime_weyl_tensor[i] = gkyl_malloc(sizeof(double**[4])); spacetime_ricci_tensor[i] = gkyl_malloc(sizeof(double[4])); for (int j = 0; j < 4; j++) { spacetime_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + spacetime_weyl_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); for (int k = 0; k < 4; k++) { - spacetime_riemann_tensor[i][j][k] = malloc(sizeof(double[4])); + spacetime_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + spacetime_weyl_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); } } } spacetime->spacetime_riemann_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_riemann_tensor); + spacetime->spacetime_weyl_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_weyl_tensor); spacetime->spacetime_ricci_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_ricci_tensor); spacetime->spacetime_ricci_scalar_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_ricci_scalar); @@ -225,6 +236,7 @@ test_gr_minkowski() for (int k = 0; k < 4; k++) { for (int l = 0; l < 4; l++) { TEST_CHECK( gkyl_compare(spacetime_riemann_tensor[i][j][k][l], 0.0, 1e-10) ); + TEST_CHECK( gkyl_compare(spacetime_weyl_tensor[i][j][k][l], 0.0, 1e-10) ); } } } @@ -250,12 +262,15 @@ test_gr_minkowski() for (int k = 0; k < 3; k++) { gkyl_free(spatial_riemann_tensor[i][j][k]); + gkyl_free(spatial_weyl_tensor[i][j][k]); } gkyl_free(spatial_riemann_tensor[i][j]); + gkyl_free(spatial_weyl_tensor[i][j]); } gkyl_free(spatial_metric_der[i]); gkyl_free(spatial_christoffel[i]); gkyl_free(spatial_riemann_tensor[i]); + gkyl_free(spatial_weyl_tensor[i]); } gkyl_free(spatial_metric); gkyl_free(inv_spatial_metric); @@ -265,6 +280,7 @@ test_gr_minkowski() gkyl_free(shift_vector_der); gkyl_free(lapse_function_der); gkyl_free(spatial_riemann_tensor); + gkyl_free(spatial_weyl_tensor); gkyl_free(spatial_ricci_tensor); for (int i = 0; i < 4; i++) { @@ -278,18 +294,22 @@ test_gr_minkowski() for (int k = 0; k < 4; k++) { gkyl_free(spacetime_riemann_tensor[i][j][k]); + gkyl_free(spacetime_weyl_tensor[i][j][k]); } gkyl_free(spacetime_riemann_tensor[i][j]); + gkyl_free(spacetime_weyl_tensor[i][j]); } gkyl_free(spacetime_metric_der[i]); gkyl_free(spacetime_christoffel[i]); gkyl_free(spacetime_riemann_tensor[i]); + gkyl_free(spacetime_weyl_tensor[i]); } gkyl_free(spacetime_metric); gkyl_free(inv_spacetime_metric); gkyl_free(spacetime_metric_der); gkyl_free(spacetime_christoffel); gkyl_free(spacetime_riemann_tensor); + gkyl_free(spacetime_weyl_tensor); gkyl_free(spacetime_ricci_tensor); } } @@ -513,6 +533,57 @@ test_gr_schwarzschild() TEST_CHECK( gkyl_compare(spacetime_ricci_scalar, 0.0, 1e-2) ); + double ****spacetime_riemann_tensor = gkyl_malloc(sizeof(double***[4])); + double ****covariant_spacetime_riemann_tensor = gkyl_malloc(sizeof(double***[4])); + double ****spacetime_weyl_tensor = gkyl_malloc(sizeof(double***[4])); + + for (int i = 0; i < 4; i++) { + spacetime_riemann_tensor[i] = gkyl_malloc(sizeof(double**[4])); + covariant_spacetime_riemann_tensor[i] = gkyl_malloc(sizeof(double**[4])); + spacetime_weyl_tensor[i] = gkyl_malloc(sizeof(double**[4])); + + for (int j = 0; j < 4; j++) { + spacetime_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + covariant_spacetime_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + spacetime_weyl_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + + for (int k = 0; k < 4; k++) { + spacetime_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + covariant_spacetime_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + spacetime_weyl_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + + for (int l = 0; l < 4; l++) { + covariant_spacetime_riemann_tensor[i][j][k][l] = 0.0; + } + } + } + } + + spacetime->spacetime_riemann_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_riemann_tensor); + spacetime->spacetime_weyl_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_weyl_tensor); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 4; l++) { + for (int m = 0; m < 4; m++) { + covariant_spacetime_riemann_tensor[i][j][k][l] += spacetime_metric[i][m] * spacetime_riemann_tensor[m][j][k][l]; + } + } + } + } + } + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 4; l++) { + TEST_CHECK( gkyl_compare(covariant_spacetime_riemann_tensor[i][j][k][l], spacetime_weyl_tensor[i][j][k][l], 1e-2) ); + } + } + } + } + bool in_excision_region; spacetime->excision_region_func(spacetime, 0.0, x, y, 0.0, &in_excision_region); @@ -557,11 +628,23 @@ test_gr_schwarzschild() gkyl_free(spacetime_metric_der[i][j]); gkyl_free(spacetime_christoffel[i][j]); gkyl_free(spacetime_metric_cov_der[i][j]); + + for (int k = 0; k < 4; k++) { + gkyl_free(spacetime_riemann_tensor[i][j][k]); + gkyl_free(covariant_spacetime_riemann_tensor[i][j][k]); + gkyl_free(spacetime_weyl_tensor[i][j][k]); + } + gkyl_free(spacetime_riemann_tensor[i][j]); + gkyl_free(covariant_spacetime_riemann_tensor[i][j]); + gkyl_free(spacetime_weyl_tensor[i][j]); } gkyl_free(spacetime_metric_der[i]); gkyl_free(spacetime_christoffel[i]); gkyl_free(spacetime_metric_cov_der[i]); gkyl_free(spacetime_ricci_tensor[i]); + gkyl_free(spacetime_riemann_tensor[i]); + gkyl_free(covariant_spacetime_riemann_tensor[i]); + gkyl_free(spacetime_weyl_tensor[i]); } gkyl_free(spacetime_metric); gkyl_free(inv_spacetime_metric); @@ -570,6 +653,9 @@ test_gr_schwarzschild() gkyl_free(spacetime_christoffel); gkyl_free(spacetime_metric_cov_der); gkyl_free(spacetime_ricci_tensor); + gkyl_free(spacetime_riemann_tensor); + gkyl_free(covariant_spacetime_riemann_tensor); + gkyl_free(spacetime_weyl_tensor); } else { bool in_excision_region; @@ -799,6 +885,57 @@ test_gr_kerr() TEST_CHECK( gkyl_compare(spacetime_ricci_scalar, 0.0, 1e-2) ); + double ****spacetime_riemann_tensor = gkyl_malloc(sizeof(double***[4])); + double ****covariant_spacetime_riemann_tensor = gkyl_malloc(sizeof(double***[4])); + double ****spacetime_weyl_tensor = gkyl_malloc(sizeof(double***[4])); + + for (int i = 0; i < 4; i++) { + spacetime_riemann_tensor[i] = gkyl_malloc(sizeof(double**[4])); + covariant_spacetime_riemann_tensor[i] = gkyl_malloc(sizeof(double**[4])); + spacetime_weyl_tensor[i] = gkyl_malloc(sizeof(double**[4])); + + for (int j = 0; j < 4; j++) { + spacetime_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + covariant_spacetime_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + spacetime_weyl_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + + for (int k = 0; k < 4; k++) { + spacetime_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + covariant_spacetime_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + spacetime_weyl_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + + for (int l = 0; l < 4; l++) { + covariant_spacetime_riemann_tensor[i][j][k][l] = 0.0; + } + } + } + } + + spacetime->spacetime_riemann_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_riemann_tensor); + spacetime->spacetime_weyl_tensor_func(spacetime, 0.0, x, y, 0.0, pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), pow(10.0, -6.0), &spacetime_weyl_tensor); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 4; l++) { + for (int m = 0; m < 4; m++) { + covariant_spacetime_riemann_tensor[i][j][k][l] += spacetime_metric[i][m] * spacetime_riemann_tensor[m][j][k][l]; + } + } + } + } + } + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 4; l++) { + TEST_CHECK( gkyl_compare(covariant_spacetime_riemann_tensor[i][j][k][l], spacetime_weyl_tensor[i][j][k][l], 1e-2) ); + } + } + } + } + bool in_excision_region; spacetime->excision_region_func(spacetime, 0.0, x, y, 0.0, &in_excision_region); @@ -843,11 +980,23 @@ test_gr_kerr() gkyl_free(spacetime_metric_der[i][j]); gkyl_free(spacetime_christoffel[i][j]); gkyl_free(spacetime_metric_cov_der[i][j]); + + for (int k = 0; k < 4; k++) { + gkyl_free(spacetime_riemann_tensor[i][j][k]); + gkyl_free(covariant_spacetime_riemann_tensor[i][j][k]); + gkyl_free(spacetime_weyl_tensor[i][j][k]); + } + gkyl_free(spacetime_riemann_tensor[i][j]); + gkyl_free(covariant_spacetime_riemann_tensor[i][j]); + gkyl_free(spacetime_weyl_tensor[i][j]); } gkyl_free(spacetime_metric_der[i]); gkyl_free(spacetime_christoffel[i]); gkyl_free(spacetime_metric_cov_der[i]); gkyl_free(spacetime_ricci_tensor[i]); + gkyl_free(spacetime_riemann_tensor[i]); + gkyl_free(covariant_spacetime_riemann_tensor[i]); + gkyl_free(spacetime_weyl_tensor[i]); } gkyl_free(spacetime_metric); gkyl_free(inv_spacetime_metric); @@ -856,6 +1005,9 @@ test_gr_kerr() gkyl_free(spacetime_christoffel); gkyl_free(spacetime_metric_cov_der); gkyl_free(spacetime_ricci_tensor); + gkyl_free(spacetime_riemann_tensor); + gkyl_free(covariant_spacetime_riemann_tensor); + gkyl_free(spacetime_weyl_tensor); } else { bool in_excision_region; diff --git a/zero/gkyl_gr_blackhole.h b/zero/gkyl_gr_blackhole.h index 040a38949..ed46c208f 100644 --- a/zero/gkyl_gr_blackhole.h +++ b/zero/gkyl_gr_blackhole.h @@ -445,6 +445,43 @@ static void blackhole_spacetime_ricci_scalar(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dt, const double dx, const double dy, const double dz, double* spacetime_ricci_scalar); +/** +* Compute the rank-4 (spatial) Weyl curvature tensor at a given point in a black hole spacetime. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spatial_weyl_tensor Rank-4 spatial Weyl curvature tensor (output). +*/ +GKYL_CU_D +static void +blackhole_spatial_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor); + +/** +* Compute the rank-4 (spacetime) Weyl curvature tensor at a given point in a black hole spacetime. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dt Time coordinate spacing. +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spacetime_weyl_tensor Rank-4 spacetime Weyl curvature tensor (output). +*/ +GKYL_CU_D +static void +blackhole_spacetime_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor); + /** * Compute the rank-2 extrinsic curvature tensor at a given point in a black hole spacetime. * diff --git a/zero/gkyl_gr_minkowski.h b/zero/gkyl_gr_minkowski.h index dfe74353f..38e5207fe 100644 --- a/zero/gkyl_gr_minkowski.h +++ b/zero/gkyl_gr_minkowski.h @@ -356,6 +356,43 @@ static void minkowski_spacetime_ricci_scalar(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dt, const double dx, const double dy, const double dz, double* spacetime_ricci_scalar); +/** +* Compute the rank-4 (spatial) Weyl curvature tensor at a given pont in Minkowski space. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spatial_weyl_tensor Rank-4 spatial Weyl curvature tensor (output). +*/ +GKYL_CU_D +static void +minkowski_spatial_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor); + +/** +* Compute the rank-4 (spacetime) Weyl curvature tensor at a given point in Minkowski space. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dt Time coordinate spacing. +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spacetime_weyl_tensor Rank-4 spacetime Weyl curvature tensor (output). +*/ +GKYL_CU_D +static void +minkowski_spacetime_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor); + /** * Compute the rank-2 extrinsic curvature tensor at a given point in Minkowski space. * diff --git a/zero/gkyl_gr_spacetime.h b/zero/gkyl_gr_spacetime.h index a8ec464de..ea49e51fc 100644 --- a/zero/gkyl_gr_spacetime.h +++ b/zero/gkyl_gr_spacetime.h @@ -87,6 +87,14 @@ typedef void (*gr_spatial_ricci_scalar_t)(const struct gkyl_gr_spacetime* spacet typedef void (*gr_spacetime_ricci_scalar_t)(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dt, const double dx, const double dy, const double dz, double* spacetime_ricci_scalar); +// Function pointer to compute the rank-4 (spatial) Weyl curvature tensor at a given point in spacetime. +typedef void (*gr_spatial_weyl_tensor_t)(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, + const double z, const double dx, const double dy, const double dz, double***** spatial_weyl_tensor); + +// Function pointer to compute the rank-4 (spacetime) Weyl curvature tensor at a given point in spacetime. +typedef void (*gr_spacetime_weyl_tensor_t)(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, + const double z, const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor); + // Function pointer to compute the rank-2 extrinsic curvature tensor at a given point in spacetime. typedef void (*gr_extrinsic_curvature_tensor_t)(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dx, const double dy, const double dz, double*** extrinsic_curvature_tensor); @@ -126,6 +134,9 @@ struct gkyl_gr_spacetime { gr_spatial_ricci_scalar_t spatial_ricci_scalar_func; // Function to compute spatial Ricci scalar curvature. gr_spacetime_ricci_scalar_t spacetime_ricci_scalar_func; // Function to compute spacetime Ricci scalar curvature. + gr_spatial_weyl_tensor_t spatial_weyl_tensor_func; // Function to compute spatial Weyl curvature tensor. + gr_spacetime_weyl_tensor_t spacetime_weyl_tensor_func; // Function to compute spacetime Weyl curvature tensor. + gr_extrinsic_curvature_tensor_t extrinsic_curvature_tensor_func; // Function to compute extrinsic curvature tensor. gr_excision_region_t excision_region_func; // Function to determine whether point lies within excision region. @@ -476,6 +487,43 @@ static inline void gkyl_gr_spacetime_ricci_scalar(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dt, const double dx, const double dy, const double dz, double* spacetime_ricci_scalar); +/** +* Compute the rank-4 (spatial) Weyl curvature tensor at a given point in spacetime. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spatial_weyl_tensor Rank-4 spatial Weyl curvature tensor (output). +*/ +GKYL_CU_DH +static inline void +gkyl_gr_spatial_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor); + +/** +* Compute the rank-4 (spacetime) Weyl curvature tensor at a given point in spacetime. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dt Time coordinate spacing. +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spacetime_weyl_tensor Rank-4 spacetime Weyl curvature tensor (output). +*/ +GKYL_CU_DH +static inline void +gkyl_gr_spacetime_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor); + /** * Compute the rank-2 extrinsic curvature tensor at a given point in spacetime. * diff --git a/zero/gkyl_gr_spacetime_diff.h b/zero/gkyl_gr_spacetime_diff.h index 3f290430e..703afedf1 100644 --- a/zero/gkyl_gr_spacetime_diff.h +++ b/zero/gkyl_gr_spacetime_diff.h @@ -225,4 +225,41 @@ gkyl_gr_spatial_ricci_scalar_fd(const struct gkyl_gr_spacetime* spacetime, const GKYL_CU_D void gkyl_gr_spacetime_ricci_scalar_fd(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, - const double dt, const double dx, const double dy, const double dz, double* spacetime_ricci_scalar); \ No newline at end of file + const double dt, const double dx, const double dy, const double dz, double* spacetime_ricci_scalar); + +/** +* Compute the rank-4 (spatial) Weyl curvature tensor at a given point in spacetime, using finite differences. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spatial_weyl_tensor Rank-4 spatial Weyl curvature tensor (output). +*/ +GKYL_CU_D +void +gkyl_gr_spatial_weyl_tensor_fd(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor); + +/** +* Compute the rank-4 (spacetime) Weyl curvature tensor at a given point in spacetime, using finite differences. +* +* @param spacetime Base spacetime object. +* @param t Time coordinate. +* @param x Spatial coordinate (x-direction). +* @param y Spatial coordinate (y-direction). +* @param z Spatial coordinate (z-direction). +* @param dt Time coordinate spacing. +* @param dx Spatial coordinate spacing (x-direction). +* @param dy Spatial coordinate spacing (y-direction). +* @param dz Spatial coordinate spacing (z-direction). +* @param spacetime_weyl_tensor Rank-4 spacetime Weyl curvature tensor (output). +*/ +GKYL_CU_D +void +gkyl_gr_spacetime_weyl_tensor_fd(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor); \ No newline at end of file diff --git a/zero/gr_blackhole.c b/zero/gr_blackhole.c index 0af88f72a..7f4cd8187 100644 --- a/zero/gr_blackhole.c +++ b/zero/gr_blackhole.c @@ -437,6 +437,20 @@ blackhole_spacetime_ricci_scalar(const struct gkyl_gr_spacetime* spacetime, cons gkyl_gr_spacetime_ricci_scalar_fd(spacetime, t, x, y, z, dt, dx, dy, dz, spacetime_ricci_scalar); } +static void +blackhole_spatial_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor) +{ + gkyl_gr_spatial_weyl_tensor_fd(spacetime, t, x, y, z, dx, dy, dx, spatial_weyl_tensor); +} + +static void +blackhole_spacetime_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor) +{ + gkyl_gr_spacetime_weyl_tensor_fd(spacetime, t, x, y, z, dt, dx, dy, dz, spacetime_weyl_tensor); +} + static void blackhole_extrinsic_curvature_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dx, const double dy, const double dz, double*** extrinsic_curvature_tensor) @@ -561,6 +575,9 @@ gkyl_gr_blackhole_inew(const struct gkyl_gr_blackhole_inp* inp) gr_blackhole->spacetime.spatial_ricci_scalar_func = blackhole_spatial_ricci_scalar; gr_blackhole->spacetime.spacetime_ricci_scalar_func = blackhole_spacetime_ricci_scalar; + gr_blackhole->spacetime.spatial_weyl_tensor_func = blackhole_spatial_weyl_tensor; + gr_blackhole->spacetime.spacetime_weyl_tensor_func = blackhole_spacetime_weyl_tensor; + gr_blackhole->spacetime.extrinsic_curvature_tensor_func = blackhole_extrinsic_curvature_tensor; gr_blackhole->spacetime.excision_region_func = blackhole_excision_region; diff --git a/zero/gr_minkowski.c b/zero/gr_minkowski.c index 33958fbbe..7a3dc1e59 100644 --- a/zero/gr_minkowski.c +++ b/zero/gr_minkowski.c @@ -224,6 +224,36 @@ minkowski_spacetime_ricci_scalar(const struct gkyl_gr_spacetime* spacetime, cons *spacetime_ricci_scalar = 0.0; } +static void +minkowski_spatial_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor) +{ + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + for (int l = 0; l < 3; l++) { + (*spatial_weyl_tensor)[i][j][k][l] = 0.0; + } + } + } + } +} + +static void +minkowski_spacetime_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor) +{ + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 4; l++) { + (*spacetime_weyl_tensor)[i][j][k][l] = 0.0; + } + } + } + } +} + static void minkowski_extrinsic_curvature_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dx, const double dy, const double dz, double*** extrinsic_curvature_tensor) @@ -301,6 +331,9 @@ gkyl_gr_minkowski_inew(const struct gkyl_gr_minkowski_inp* inp) gr_minkowski->spacetime.spatial_ricci_scalar_func = minkowski_spatial_ricci_scalar; gr_minkowski->spacetime.spacetime_ricci_scalar_func = minkowski_spacetime_ricci_scalar; + gr_minkowski->spacetime.spatial_weyl_tensor_func = minkowski_spatial_weyl_tensor; + gr_minkowski->spacetime.spacetime_weyl_tensor_func = minkowski_spacetime_weyl_tensor; + gr_minkowski->spacetime.extrinsic_curvature_tensor_func = minkowski_extrinsic_curvature_tensor; gr_minkowski->spacetime.excision_region_func = minkowski_excision_region; diff --git a/zero/gr_spacetime.c b/zero/gr_spacetime.c index 58742aebc..6c295399e 100644 --- a/zero/gr_spacetime.c +++ b/zero/gr_spacetime.c @@ -143,6 +143,20 @@ gkyl_gr_spacetime_ricci_scalar(const struct gkyl_gr_spacetime* spacetime, const return spacetime->spacetime_ricci_scalar_func(spacetime, t, x, y, z, dt, dx, dy, dz, spacetime_ricci_scalar); } +static inline void +gkyl_gr_spatial_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor) +{ + return spacetime->spatial_weyl_tensor_func(spacetime, t, x, y, z, dx, dy, dz, spatial_weyl_tensor); +} + +static inline void +gkyl_gr_spacetime_weyl_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor) +{ + return spacetime->spacetime_weyl_tensor_func(spacetime, t, x, y, z, dt, dx, dy, dz, spacetime_weyl_tensor); +} + static inline void gkyl_gr_extrinsic_curvature_tensor(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, const double dx, const double dy, const double dz, double*** extrinsic_curvature_tensor) diff --git a/zero/gr_spacetime_diff.c b/zero/gr_spacetime_diff.c index 4cc128e81..282d6a35f 100644 --- a/zero/gr_spacetime_diff.c +++ b/zero/gr_spacetime_diff.c @@ -693,4 +693,138 @@ gkyl_gr_spacetime_ricci_scalar_fd(const struct gkyl_gr_spacetime* spacetime, con gkyl_free(spacetime_inv_metric_tensor); gkyl_free(spacetime_ricci_tensor); +} + +void +gkyl_gr_spatial_weyl_tensor_fd(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dx, const double dy, const double dz, double***** spatial_weyl_tensor) +{ + double ****spatial_riemann_tensor = gkyl_malloc(sizeof(double***[3])); + double ****covariant_spatial_riemann_tensor = gkyl_malloc(sizeof(double***[3])); + + for (int i = 0; i < 3; i++) { + spatial_riemann_tensor[i] = gkyl_malloc(sizeof(double**[3])); + covariant_spatial_riemann_tensor[i] = gkyl_malloc(sizeof(double**[3])); + + for (int j = 0; j < 3; j++) { + spatial_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[3])); + covariant_spatial_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[3])); + + for (int k = 0; k < 3; k++) { + spatial_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[3])); + covariant_spatial_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[3])); + + for (int l = 0; l < 3; l++) { + covariant_spatial_riemann_tensor[i][j][k][l] = 0.0; + } + } + } + } + + double **spatial_metric_tensor = gkyl_malloc(sizeof(double*[3])); + double **spatial_ricci_tensor = gkyl_malloc(sizeof(double*[3])); + + for (int i = 0; i < 3; i++) { + spatial_metric_tensor[i] = gkyl_malloc(sizeof(double[3])); + spatial_ricci_tensor[i] = gkyl_malloc(sizeof(double[3])); + } + + double spatial_ricci_scalar; + + spacetime->spatial_riemann_tensor_func(spacetime, t, x, y, z, dx, dy, dz, &spatial_riemann_tensor); + spacetime->spatial_metric_tensor_func(spacetime, t, x, y, z, &spatial_metric_tensor); + spacetime->spatial_ricci_tensor_func(spacetime, t, x, y, z, dx, dy, dz, &spatial_ricci_tensor); + spacetime->spatial_ricci_scalar_func(spacetime, t, x, y, z, dx, dy, dz, &spatial_ricci_scalar); + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + for (int l = 0; l < 3; l++) { + for (int m = 0; m < 3; m++) { + covariant_spatial_riemann_tensor[i][j][k][l] += spatial_metric_tensor[i][m] * spatial_riemann_tensor[m][j][k][l]; + } + } + } + } + } + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + for (int l = 0; l < 3; l++) { + (*spatial_weyl_tensor)[i][j][k][l] = covariant_spatial_riemann_tensor[i][j][k][l] + ((spatial_ricci_tensor[i][l] * spatial_metric_tensor[j][k]) + - (spatial_ricci_tensor[i][k] * spatial_metric_tensor[j][l]) + (spatial_ricci_tensor[j][k] * spatial_metric_tensor[i][l]) + - (spatial_ricci_tensor[j][l] * spatial_metric_tensor[i][k])) + ((0.5 * spatial_ricci_scalar) * ((spatial_metric_tensor[i][k] * spatial_metric_tensor[j][l]) + - (spatial_metric_tensor[i][l] * spatial_metric_tensor[j][k]))); + } + } + } + } +} + +void +gkyl_gr_spacetime_weyl_tensor_fd(const struct gkyl_gr_spacetime* spacetime, const double t, const double x, const double y, const double z, + const double dt, const double dx, const double dy, const double dz, double***** spacetime_weyl_tensor) +{ + double ****spacetime_riemann_tensor = gkyl_malloc(sizeof(double***[4])); + double ****covariant_spacetime_riemann_tensor = gkyl_malloc(sizeof(double***[4])); + + for (int i = 0; i < 4; i++) { + spacetime_riemann_tensor[i] = gkyl_malloc(sizeof(double**[4])); + covariant_spacetime_riemann_tensor[i] = gkyl_malloc(sizeof(double**[4])); + + for (int j = 0; j < 4; j++) { + spacetime_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + covariant_spacetime_riemann_tensor[i][j] = gkyl_malloc(sizeof(double*[4])); + + for (int k = 0; k < 4; k++) { + spacetime_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + covariant_spacetime_riemann_tensor[i][j][k] = gkyl_malloc(sizeof(double[4])); + + for (int l = 0; l < 4; l++) { + covariant_spacetime_riemann_tensor[i][j][k][l] = 0.0; + } + } + } + } + + double **spacetime_metric_tensor = gkyl_malloc(sizeof(double*[4])); + double **spacetime_ricci_tensor = gkyl_malloc(sizeof(double*[4])); + + for (int i = 0; i < 4; i++) { + spacetime_metric_tensor[i] = gkyl_malloc(sizeof(double[4])); + spacetime_ricci_tensor[i] = gkyl_malloc(sizeof(double[4])); + } + + double spacetime_ricci_scalar; + + spacetime->spacetime_riemann_tensor_func(spacetime, t, x, y, z, dt, dx, dy, dz, &spacetime_riemann_tensor); + spacetime->spacetime_metric_tensor_func(spacetime, t, x, y, z, &spacetime_metric_tensor); + spacetime->spacetime_ricci_tensor_func(spacetime, t, x, y, z, dt, dx, dy, dz, &spacetime_ricci_tensor); + spacetime->spacetime_ricci_scalar_func(spacetime, t, x, y, z, dt, dx, dy, dz, &spacetime_ricci_scalar); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 4; l++) { + for (int m = 0; m < 4; m++) { + covariant_spacetime_riemann_tensor[i][j][k][l] += spacetime_metric_tensor[i][m] * spacetime_riemann_tensor[m][j][k][l]; + } + } + } + } + } + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < 4; k++) { + for (int l = 0; l < 4; l++) { + (*spacetime_weyl_tensor)[i][j][k][l] = covariant_spacetime_riemann_tensor[i][j][k][l] + (0.5 * ((spacetime_ricci_tensor[i][l] * spacetime_metric_tensor[j][k]) + - (spacetime_ricci_tensor[i][k] * spacetime_metric_tensor[j][l]) + (spacetime_ricci_tensor[j][k] * spacetime_metric_tensor[i][l]) + - (spacetime_ricci_tensor[j][l] * spacetime_metric_tensor[i][k]))) + ((spacetime_ricci_scalar / 6.0) * ((spacetime_metric_tensor[i][k] * spacetime_metric_tensor[j][l]) + - (spacetime_metric_tensor[i][l] * spacetime_metric_tensor[j][k]))); + } + } + } + } } \ No newline at end of file