Skip to content

Commit 997aa2f

Browse files
committed
BSSN setup is now accurate (increasing r, kerr->minkowski)
1 parent 9e3dfd3 commit 997aa2f

File tree

2 files changed

+63
-9
lines changed

2 files changed

+63
-9
lines changed

Tests/Matrix/Matrix.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ int matrix_tests() {
294294

295295
tensorium::Vector<double> X(dim);
296296
X(0) = 0.0;
297-
X(1) = 3.0;
297+
X(1) = 50.0;
298298
X(2) = M_PI / 2.0;
299299
X(3) = 0.0;
300300

includes/Tensorium/DiffGeometry/BSSN/BSSNSetup.hpp

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace tensorium_RG {
4444
* - Extrinsic curvature \f$K_{ij}\f$
4545
* - Trace-free conformal extrinsic curvature \f$\tilde{A}_{ij}\f$
4646
*/
47-
struct alignas(32) BSSNGrid {
47+
struct alignas(64) BSSNGrid {
4848

4949
std::vector<double> alpha; ///< Lapse function \f$\alpha\f$
5050
std::vector<tensorium::Vector<double>> beta; ///< Shift vector \f$\beta^i\f$
@@ -68,6 +68,48 @@ struct alignas(32) BSSNGrid {
6868
contracted_Gamma; ///< Contracted symbols \f$\Gamma^i_{ij} = -\frac{3}{2} \partial_j \ln
6969
std::vector<tensorium::Tensor<double, 5>> ricci_tilde; // [NX, NY, NZ, 3, 3]
7070
};
71+
template <typename T>
72+
tensorium::Tensor<T, 2>
73+
compute_dt_gamma_from_beta(const tensorium::Tensor<T, 2> &gamma,
74+
const tensorium::Vector<T> &beta_u, // β^i
75+
const tensorium::Tensor<T, 2> &partial_beta_u, // (i,m)=∂_i β^m
76+
const tensorium::Tensor<T, 3> &christoffel, // Γ^k_{ij}
77+
const tensorium::Tensor<T, 3> &dgamma_phys) // (i,j,m)=∂_i γ_{jm}
78+
{
79+
// β_j = γ_{jm} β^m
80+
tensorium::Vector<T> beta_d(3);
81+
for (int j = 0; j < 3; ++j) {
82+
T s = 0;
83+
for (int m = 0; m < 3; ++m)
84+
s += gamma(j, m) * beta_u(m);
85+
beta_d(j) = s;
86+
}
87+
88+
// ∂_i β_j = (∂_i γ_{j m}) β^m + γ_{j m} (∂_i β^m)
89+
tensorium::Tensor<T, 2> d_beta_d({3, 3}); // (i,j)
90+
for (int i = 0; i < 3; ++i)
91+
for (int j = 0; j < 3; ++j) {
92+
T s = 0;
93+
for (int m = 0; m < 3; ++m)
94+
s += dgamma_phys(i, j, m) * beta_u(m) + gamma(j, m) * partial_beta_u(i, m);
95+
d_beta_d(i, j) = s;
96+
}
97+
98+
// D_i β_j = ∂_i β_j - Γ^k_{ij} β_k
99+
tensorium::Tensor<T, 2> Dt_g({3, 3}); // ∂_t γ_ij = D_i β_j + D_j β_i (sans -2αK_ij ici)
100+
for (int i = 0; i < 3; ++i)
101+
for (int j = 0; j < 3; ++j) {
102+
T Di_bj = d_beta_d(i, j);
103+
for (int k = 0; k < 3; ++k)
104+
Di_bj -= christoffel(i, j, k) * beta_d(k);
105+
T Dj_bi = d_beta_d(j, i);
106+
for (int k = 0; k < 3; ++k)
107+
Dj_bi -= christoffel(j, i, k) * beta_d(k);
108+
Dt_g(i, j) = Di_bj + Dj_bi;
109+
}
110+
return Dt_g;
111+
}
112+
71113
/**
72114
* @class BSSN
73115
* @brief Driver class to initialize and store BSSN variables from an input spacetime metric.
@@ -143,11 +185,24 @@ template <typename T> class BSSN {
143185

144186
tensorium_RG::ExtrinsicCurvature<T> extr;
145187
auto Kij = extr.compute_Kij(dgt, gamma_ij, beta, d_beta, christoffel_phys, alpha);
188+
dgt = compute_dt_gamma_from_beta(gamma_ij, beta, d_beta, christoffel_phys, dgamma_phys);
189+
// Lie(γ) = ∇_i β_j + ∇_j β_i
190+
auto Lie =
191+
compute_dt_gamma_from_beta(gamma_ij, beta, d_beta, christoffel_phys, dgamma_phys);
192+
print_tensor2("Lie_beta(gamma_ij)", Lie);
193+
194+
// Test de stationnarité analytique: ∂_t γ = 0 ⇒ 2 α K - Lie ≈ 0
195+
tensorium::Tensor<T, 2> resid({3, 3});
196+
for (int i = 0; i < 3; ++i)
197+
for (int j = 0; j < 3; ++j)
198+
resid(i, j) = 2.0 * alpha * Kij(i, j) - Lie(i, j);
199+
200+
print_tensor2("Stationarity residual R_ij = 2α K_ij - Lie_beta(gamma_ij)", resid);
146201

147202
tensorium_RG::BSSNAtildeTensor<T> Aij;
148203
auto AtildeTensor = Aij.compute_Atilde_tensor(Kij, gamma_ij_inv, gamma_ij, chi);
149204

150-
const size_t NX = 32, NY = 32, NZ = 32;
205+
const size_t NX = 64, NY = 64, NZ = 64;
151206

152207
tensorium::Tensor<T, 5> Atilde_full({NX, NY, NZ, 3, 3});
153208
tensorium::Tensor<T, 5> gtilde_inv_full({NX, NY, NZ, 3, 3});
@@ -166,16 +221,15 @@ template <typename T> class BSSN {
166221
}
167222
}
168223

169-
auto chi_ctx = ChiContext<T>::compute(X, dx, dy, dz, gamma_ij, dgamma_phys, metric);
170-
auto Ricci_tilde = RicciTildeTensor<T>::compute_Ricci_Tilde_tensor(
171-
chi_ctx, gamma_tilde_inv, tilde_Gamma, christoffel_tilde, gamma_tilde);
172-
224+
auto chi_ctx = ChiContext<T>::compute(X, dx, dy, dz, gamma_ij, dgamma_phys, metric);
225+
auto Ricci_tilde = RicciTildeTensor<T>::compute_Ricci_Tilde_tensor(
226+
chi_ctx, gamma_tilde_inv, tilde_Gamma, christoffel_tilde, gamma_tilde);
173227

174228
auto Ricci_chi = RicciConformalTensor<T>::compute_Ricci_chi_total(
175229
chi_ctx, gamma_tilde, gamma_tilde_inv, christoffel_tilde);
176230

177-
auto Ricci = RicciPhysicalTensor<T>::compute_Ricci_total(chi_ctx, gamma_tilde, gamma_tilde_inv,
178-
tilde_Gamma, christoffel_tilde);
231+
auto Ricci = RicciPhysicalTensor<T>::compute_Ricci_total(
232+
chi_ctx, gamma_tilde, gamma_tilde_inv, tilde_Gamma, christoffel_tilde);
179233

180234
grid.alpha = {alpha};
181235
grid.beta = {beta};

0 commit comments

Comments
 (0)