Skip to content

Commit 404b261

Browse files
committed
Add covariant derivative of extrinsic curvature
Fix
1 parent 1b88967 commit 404b261

File tree

9 files changed

+147
-6
lines changed

9 files changed

+147
-6
lines changed

src/PointwiseFunctions/GeneralRelativity/ExtrinsicCurvature.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,37 @@ tnsr::ii<DataType, SpatialDim, Frame> extrinsic_curvature(
4646
spatial_metric, dt_spatial_metric, deriv_spatial_metric);
4747
return ex_curvature;
4848
}
49+
50+
template <typename DataType, size_t SpatialDim, typename Frame>
51+
void covariant_derivative_of_extrinsic_curvature(
52+
const gsl::not_null<tnsr::ijj<DataType, SpatialDim, Frame>*> grad_ex_curv,
53+
const tnsr::ijj<DataType, SpatialDim, Frame>& d_ex_curv,
54+
const tnsr::ii<DataType, SpatialDim, Frame>& ex_curv,
55+
const tnsr::Ijj<DataType, SpatialDim, Frame>&
56+
spatial_christoffel_second_kind) {
57+
set_number_of_grid_points(grad_ex_curv, ex_curv);
58+
tenex::evaluate<ti::i, ti::j, ti::k>(
59+
grad_ex_curv, d_ex_curv(ti::i, ti::j, ti::k) -
60+
spatial_christoffel_second_kind(ti::L, ti::i, ti::j) *
61+
ex_curv(ti::l, ti::k) -
62+
spatial_christoffel_second_kind(ti::L, ti::i, ti::k) *
63+
ex_curv(ti::j, ti::l));
64+
}
65+
66+
template <typename DataType, size_t SpatialDim, typename Frame>
67+
tnsr::ijj<DataType, SpatialDim, Frame>
68+
covariant_derivative_of_extrinsic_curvature(
69+
const tnsr::ijj<DataType, SpatialDim, Frame>& d_ex_curv,
70+
const tnsr::ii<DataType, SpatialDim, Frame>& ex_curv,
71+
const tnsr::Ijj<DataType, SpatialDim, Frame>&
72+
spatial_christoffel_second_kind) {
73+
tnsr::ijj<DataType, SpatialDim, Frame> grad_ex_curv{};
74+
covariant_derivative_of_extrinsic_curvature(make_not_null(&grad_ex_curv),
75+
d_ex_curv, ex_curv,
76+
spatial_christoffel_second_kind);
77+
return grad_ex_curv;
78+
}
79+
4980
} // namespace gr
5081

5182
#define DIM(data) BOOST_PP_TUPLE_ELEM(0, data)
@@ -71,7 +102,20 @@ tnsr::ii<DataType, SpatialDim, Frame> extrinsic_curvature(
71102
const tnsr::ii<DTYPE(data), DIM(data), FRAME(data)>& spatial_metric, \
72103
const tnsr::ii<DTYPE(data), DIM(data), FRAME(data)>& dt_spatial_metric, \
73104
const tnsr::ijj<DTYPE(data), DIM(data), FRAME(data)>& \
74-
deriv_spatial_metric);
105+
deriv_spatial_metric); \
106+
template void gr::covariant_derivative_of_extrinsic_curvature( \
107+
const gsl::not_null<tnsr::ijj<DTYPE(data), DIM(data), FRAME(data)>*> \
108+
grad_ex_curv, \
109+
const tnsr::ijj<DTYPE(data), DIM(data), FRAME(data)>& d_ex_curv, \
110+
const tnsr::ii<DTYPE(data), DIM(data), FRAME(data)>& ex_curv, \
111+
const tnsr::Ijj<DTYPE(data), DIM(data), FRAME(data)>& \
112+
spatial_christoffel_second_kind); \
113+
template tnsr::ijj<DTYPE(data), DIM(data), FRAME(data)> \
114+
gr::covariant_derivative_of_extrinsic_curvature( \
115+
const tnsr::ijj<DTYPE(data), DIM(data), FRAME(data)>& d_ex_curv, \
116+
const tnsr::ii<DTYPE(data), DIM(data), FRAME(data)>& ex_curv, \
117+
const tnsr::Ijj<DTYPE(data), DIM(data), FRAME(data)>& \
118+
spatial_christoffel_second_kind);
75119

76120
GENERATE_INSTANTIATIONS(INSTANTIATE, (1, 2, 3), (double, DataVector),
77121
(Frame::Grid, Frame::Distorted, Frame::Inertial))

src/PointwiseFunctions/GeneralRelativity/ExtrinsicCurvature.hpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <cstddef>
77

88
#include "DataStructures/Tensor/TypeAliases.hpp"
9+
#include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
910
#include "Utilities/Gsl.hpp"
1011

1112
/// \ingroup GeneralRelativityGroup
@@ -47,4 +48,60 @@ void extrinsic_curvature(
4748
const tnsr::ii<DataType, SpatialDim, Frame>& dt_spatial_metric,
4849
const tnsr::ijj<DataType, SpatialDim, Frame>& deriv_spatial_metric);
4950
/// @}
51+
52+
/// @{
53+
/*!
54+
* \ingroup GeneralRelativityGroup
55+
* \brief Computes the spatial covariant derivative of the extrinsic curvature.
56+
* \details The spatial covariant derivative is computed as
57+
* \f[ D_k K_{ij} = \partial_k K_{ij} - {^{(3)}\Gamma^{l}_{ki}} K_{lj}
58+
* - {^{(3)}\Gamma^{l}_{kj}}K_{il} \f]
59+
* where \f$ {^{(3)}\Gamma^{k}_{ij}} \f$ is the spatial Christoffel symbol of
60+
* the second kind.
61+
*/
62+
template <typename DataType, size_t SpatialDim, typename Frame>
63+
tnsr::ijj<DataType, SpatialDim, Frame>
64+
covariant_derivative_of_extrinsic_curvature(
65+
const tnsr::ijj<DataType, SpatialDim, Frame>& d_ex_curv,
66+
const tnsr::ii<DataType, SpatialDim, Frame>& ex_curv,
67+
const tnsr::Ijj<DataType, SpatialDim, Frame>&
68+
spatial_christoffel_second_kind);
69+
template <typename DataType, size_t SpatialDim, typename Frame>
70+
void covariant_derivative_of_extrinsic_curvature(
71+
gsl::not_null<tnsr::ijj<DataType, SpatialDim, Frame>*> grad_ex_curv,
72+
const tnsr::ijj<DataType, SpatialDim, Frame>& d_ex_curv,
73+
const tnsr::ii<DataType, SpatialDim, Frame>& ex_curv,
74+
const tnsr::Ijj<DataType, SpatialDim, Frame>&
75+
spatial_christoffel_second_kind);
76+
/// @}
77+
78+
namespace Tags {
79+
/// \copydoc covariant_derivative_of_extrinsic_curvature
80+
template <size_t SpatialDim, typename Frame>
81+
struct CovariantDerivativeOfExtrinsicCurvatureCompute
82+
: gr::Tags::CovariantDerivativeOfExtrinsicCurvature<DataVector, SpatialDim,
83+
Frame>,
84+
db::ComputeTag {
85+
using argument_tags = tmpl::list<
86+
::Tags::deriv<gr::Tags::ExtrinsicCurvature<DataVector, SpatialDim, Frame>,
87+
tmpl::size_t<SpatialDim>, Frame>,
88+
gr::Tags::ExtrinsicCurvature<DataVector, SpatialDim, Frame>,
89+
gr::Tags::SpatialChristoffelSecondKind<DataVector, SpatialDim, Frame>>;
90+
91+
using return_type = tnsr::ijj<DataVector, SpatialDim, Frame>;
92+
93+
static constexpr auto function = static_cast<void (*)(
94+
const gsl::not_null<tnsr::ijj<DataVector, SpatialDim, Frame>*>,
95+
const tnsr::ijj<DataVector, SpatialDim, Frame>&,
96+
const tnsr::ii<DataVector, SpatialDim, Frame>&,
97+
const tnsr::Ijj<DataVector, SpatialDim, Frame>&
98+
spatial_christoffel_second_kind)>(
99+
&covariant_derivative_of_extrinsic_curvature<DataVector, SpatialDim,
100+
Frame>);
101+
102+
using base =
103+
gr::Tags::CovariantDerivativeOfExtrinsicCurvature<DataVector, SpatialDim,
104+
Frame>;
105+
};
106+
} // namespace Tags
50107
} // namespace gr

src/PointwiseFunctions/GeneralRelativity/Tags.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ template <typename DataType>
143143
struct TraceExtrinsicCurvature : db::SimpleTag {
144144
using type = Scalar<DataType>;
145145
};
146+
template <typename DataType, size_t Dim, typename Frame>
147+
struct CovariantDerivativeOfExtrinsicCurvature : db::SimpleTag {
148+
using type = tnsr::ijj<DataType, Dim, Frame>;
149+
};
146150

147151
/*!
148152
* \brief Holds a quantity that's similar to the shift, but isn't the shift.

src/PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ template <typename DataType, size_t Dim, typename Frame = Frame::Inertial>
6161
struct ExtrinsicCurvature;
6262
template <typename DataType>
6363
struct TraceExtrinsicCurvature;
64+
template <typename DataType, size_t Dim, typename Frame>
65+
struct CovariantDerivativeOfExtrinsicCurvature;
6466
template <typename DataType, size_t Dim, typename Frame = Frame::Inertial>
6567
struct SpatialRicci;
6668
template <typename DataType>

src/PointwiseFunctions/GeneralRelativity/WeylMagnetic.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@ template <typename DataType, size_t Dim, typename Frame>
8484
struct WeylMagneticCompute : WeylMagnetic<DataType, Dim, Frame>,
8585
db::ComputeTag {
8686
using argument_tags = tmpl::list<
87-
::Tags::deriv<gr::Tags::ExtrinsicCurvature<DataType, Dim, Frame>,
88-
tmpl::size_t<Dim>, Frame>,
87+
gr::Tags::CovariantDerivativeOfExtrinsicCurvature<DataType, Dim, Frame>,
8988
gr::Tags::SpatialMetric<DataType, Dim, Frame>,
9089
gr::Tags::SqrtDetSpatialMetric<DataType>>;
9190

tests/Unit/PointwiseFunctions/GeneralRelativity/ComputeSpacetimeQuantities.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,22 @@ def extrinsic_curvature(
153153
return ext_curve
154154

155155

156+
def covariant_deriv_extrinsic_curvture_adm(
157+
d_ex_curv,
158+
ex_curv,
159+
spatial_christoffel_second_kind,
160+
):
161+
grad_ex_curv = d_ex_curv
162+
grad_ex_curv += -np.einsum(
163+
"lki,lj->kij", spatial_christoffel_second_kind, ex_curv
164+
)
165+
grad_ex_curv += -np.einsum(
166+
"lkj,il->kij", spatial_christoffel_second_kind, ex_curv
167+
)
168+
169+
return grad_ex_curv
170+
171+
156172
def deriv_inverse_spatial_metric(inverse_spatial_metric, d_spatial_metric):
157173
return -np.einsum(
158174
"in,mj,knm->kij",

tests/Unit/PointwiseFunctions/GeneralRelativity/Test_ComputeSpacetimeQuantities.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,18 @@ void test_compute_extrinsic_curvature(const DataType& used_for_size) {
153153
"ComputeSpacetimeQuantities", "extrinsic_curvature", {{{-10., 10.}}},
154154
used_for_size);
155155
}
156-
156+
template <size_t SpatialDim, typename DataType>
157+
void test_cov_deriv_extrinsic_curvature_adm(const DataType& used_for_size) {
158+
pypp::check_with_random_values<1>(
159+
static_cast<tnsr::ijj<DataType, SpatialDim, Frame::Inertial> (*)(
160+
const tnsr::ijj<DataType, SpatialDim, Frame::Inertial>&,
161+
const tnsr::ii<DataType, SpatialDim, Frame::Inertial>&,
162+
const tnsr::Ijj<DataType, SpatialDim, Frame::Inertial>&)>(
163+
&::gr::covariant_derivative_of_extrinsic_curvature<
164+
DataType, SpatialDim, Frame::Inertial>),
165+
"ComputeSpacetimeQuantities", "covariant_deriv_extrinsic_curvture_adm",
166+
{{{-1., 1.}}}, used_for_size);
167+
}
157168
template <size_t Dim, typename T>
158169
void test_compute_spatial_metric_lapse_shift(const T& used_for_size) {
159170
// Set up random values for lapse, shift, and spatial_metric.
@@ -232,6 +243,8 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.GeneralRelativity.SpacetimeDecomp",
232243
(1, 2, 3));
233244
CHECK_FOR_DOUBLES_AND_DATAVECTORS(test_compute_deriv_inverse_spatial_metric,
234245
(1, 2, 3));
246+
CHECK_FOR_DOUBLES_AND_DATAVECTORS(test_cov_deriv_extrinsic_curvature_adm,
247+
(1, 2, 3));
235248

236249
// Check that compute items work correctly in the DataBox
237250
// First, check that the names are correct
@@ -263,6 +276,9 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.GeneralRelativity.SpacetimeDecomp",
263276
TestHelpers::db::test_compute_tag<
264277
gr::Tags::DerivativesOfSpacetimeMetricCompute<3, Frame::Inertial>>(
265278
"DerivativesOfSpacetimeMetric");
279+
TestHelpers::db::test_compute_tag<
280+
gr::Tags::CovariantDerivativeOfExtrinsicCurvatureCompute<
281+
3, Frame::Inertial>>("CovariantDerivativeOfExtrinsicCurvature");
266282

267283
// Second, put the compute items into a data box and check that they
268284
// put the correct results

tests/Unit/PointwiseFunctions/GeneralRelativity/Test_Tags.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ void test_simple_tags() {
8181
gr::Tags::ExtrinsicCurvature<Type, Dim, Frame>>("ExtrinsicCurvature");
8282
TestHelpers::db::test_simple_tag<gr::Tags::TraceExtrinsicCurvature<Type>>(
8383
"TraceExtrinsicCurvature");
84+
TestHelpers::db::test_simple_tag<
85+
gr::Tags::CovariantDerivativeOfExtrinsicCurvature<Type, Dim, Frame>>(
86+
"CovariantDerivativeOfExtrinsicCurvature");
8487
TestHelpers::db::test_simple_tag<gr::Tags::SpatialRicci<Type, Dim, Frame>>(
8588
"SpatialRicci");
8689
TestHelpers::db::test_simple_tag<gr::Tags::EnergyDensity<Type>>(

tests/Unit/PointwiseFunctions/GeneralRelativity/Test_WeylMagnetic.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ void test_compute_item_in_databox(const DataType& used_for_size) {
7474
make_not_null(&inverse_spatial_metric), used_for_size);
7575

7676
const auto box = db::create<
77-
db::AddSimpleTags<::Tags::deriv<gr::Tags::ExtrinsicCurvature<DataType, 3>,
78-
tmpl::size_t<3>, Frame::Inertial>,
77+
db::AddSimpleTags<gr::Tags::CovariantDerivativeOfExtrinsicCurvature<
78+
DataType, 3, Frame::Inertial>,
7979
gr::Tags::SpatialMetric<DataType, 3>,
8080
gr::Tags::SqrtDetSpatialMetric<DataType>,
8181
gr::Tags::InverseSpatialMetric<DataType, 3>>,

0 commit comments

Comments
 (0)