Skip to content

Commit

Permalink
Added spatial and spacetime Weyl tensor computations (e.g. for potent…
Browse files Browse the repository at this point in the history
…ial 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.
  • Loading branch information
JonathanGorard committed May 6, 2024
1 parent 2763af7 commit ee8771b
Show file tree
Hide file tree
Showing 9 changed files with 512 additions and 3 deletions.
156 changes: 154 additions & 2 deletions unit/ctest_gr_spacetime.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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) );
}
}
}
Expand All @@ -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);

Expand All @@ -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) );
}
}
}
Expand All @@ -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);
Expand All @@ -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++) {
Expand All @@ -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);
}
}
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down
37 changes: 37 additions & 0 deletions zero/gkyl_gr_blackhole.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
37 changes: 37 additions & 0 deletions zero/gkyl_gr_minkowski.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
Loading

0 comments on commit ee8771b

Please sign in to comment.