@@ -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