Tensorium
Loading...
Searching...
No Matches
BSSNSetup.hpp
Go to the documentation of this file.
1
12#pragma once
13
14#include "../../Core/Tensor.hpp"
15#include "../../Core/Vector.hpp"
16#include "../Metric.hpp"
17#include "BSSNAtildeTensor.hpp"
18#include "BSSNAutoDiff.hpp"
19#include "BSSNChristoffel.hpp"
22#include "BSSNMetricUtils.hpp"
23#include "BSSNPrintDebug.hpp"
24#include "BSSNRicciComplete.hpp"
28#include "BSSNextrinTensor.hpp"
29#include <iostream>
30
31namespace tensorium_RG {
47struct alignas(32) BSSNGrid {
48
49 std::vector<double> alpha;
50 std::vector<tensorium::Vector<double>> beta;
51 std::vector<tensorium::Tensor<double, 2>> gamma_ij;
52 std::vector<tensorium::Tensor<double, 2>> gamma_ij_inv;
53 std::vector<double> chi;
54 std::vector<tensorium::Tensor<double, 2>>
56 std::vector<tensorium::Tensor<double, 2>>
58 std::vector<tensorium::Tensor<double, 3>>
60 std::vector<tensorium::Tensor<double, 3>>
62 std::vector<tensorium::Tensor<double, 2>> ExtrinsicTensor;
63 std::vector<tensorium::Tensor<double, 2>>
65 std::vector<tensorium::Vector<double>>
67 std::vector<tensorium::Vector<double>>
69 std::vector<tensorium::Tensor<double, 5>> ricci_tilde; // [NX, NY, NZ, 3, 3]
70};
81template <typename T> class BSSN {
82 public:
84
85 void init_BSSN(const tensorium::Vector<T> &X, const tensorium_RG::Metric<T> &metric, T dx, T dy,
86 T dz) {
87 T alpha;
89 tensorium::Tensor<T, 2> gamma_ij({3, 3});
90 metric.BSSN(X, alpha, beta, gamma_ij);
91
92 tensorium::Tensor<T, 2> dgt({3, 3});
93 tensorium::Tensor<T, 2> gamma_ij_inv = inv_mat_tensor(gamma_ij);
94 T chi = metric.compute_conformal_factor(gamma_ij);
95 tensorium::Tensor<T, 2> gamma_tilde = compute_conformal_metric(metric, gamma_ij, chi);
96 tensorium::Tensor<T, 2> gamma_tilde_inv = inv_mat_tensor(gamma_tilde);
97
98 auto dgamma_tilde = autodiff(
99 X, dx, dy, dz,
100 [&](const tensorium::Vector<T> &Xs) {
101 T a_tmp;
102 tensorium::Vector<T> b_tmp(3);
103 tensorium::Tensor<T, 2> g_tmp({3, 3});
104 metric.BSSN(Xs, a_tmp, b_tmp, g_tmp);
105 T chi_tmp = compute_conformal_factor(metric, g_tmp);
106 return compute_conformal_metric(metric, g_tmp, chi_tmp);
107 },
109
110 tensorium::Tensor<T, 3> christoffel_tilde({3, 3, 3});
111 compute_christoffel_3D(gamma_tilde, dgamma_tilde, gamma_tilde_inv, christoffel_tilde);
112
113 tensorium::Vector<T> tilde_Gamma(3);
114 TildeGamma<T>::compute(gamma_tilde_inv, christoffel_tilde, tilde_Gamma);
115
116 auto contracted_Gamma =
118
119 auto d_beta = autodiff(
120 X, dx, dy, dz,
121 [&](const tensorium::Vector<T> &Xs) {
122 T a_tmp;
123 tensorium::Vector<T> b_tmp(3);
124 tensorium::Tensor<T, 2> g_tmp({3, 3});
125 metric.BSSN(Xs, a_tmp, b_tmp, g_tmp);
126 return b_tmp;
127 },
129
130 auto dgamma_phys = autodiff(
131 X, dx, dy, dz,
132 [&](const tensorium::Vector<T> &Xs) {
133 T a_tmp;
134 tensorium::Vector<T> b_tmp(3);
135 tensorium::Tensor<T, 2> g_tmp({3, 3});
136 metric.BSSN(Xs, a_tmp, b_tmp, g_tmp);
137 return g_tmp;
138 },
140
141 tensorium::Tensor<T, 3> christoffel_phys({3, 3, 3});
142 compute_christoffel_3D(gamma_ij, dgamma_phys, gamma_ij_inv, christoffel_phys);
143
145 auto Kij = extr.compute_Kij(dgt, gamma_ij, beta, d_beta, christoffel_phys, alpha);
146
148 auto AtildeTensor = Aij.compute_Atilde_tensor(Kij, gamma_ij_inv, gamma_ij, chi);
149
150 const size_t NX = 1, NY = 1, NZ = 1;
151
152 tensorium::Tensor<T, 5> Atilde_full({NX, NY, NZ, 3, 3});
153 tensorium::Tensor<T, 5> gtilde_inv_full({NX, NY, NZ, 3, 3});
154 for (size_t i = 0; i < NX; ++i) {
155 for (size_t j = 0; j < NY; ++j) {
156 for (size_t k = 0; k < NZ; ++k) {
157 for (int a = 0; a < 3; ++a) {
158 for (int b = 0; b < 3; ++b) {
159 Atilde_full(std::array<size_t, 5>{i, j, k, (size_t)a, (size_t)b}) =
160 AtildeTensor(a, b);
161 gtilde_inv_full(std::array<size_t, 5>{i, j, k, (size_t)a, (size_t)b}) =
162 gamma_tilde_inv(a, b);
163 }
164 }
165 }
166 }
167 }
168
169 auto psi_full = ConstraintSolver<T>::solveLichnerowicz(Atilde_full, gtilde_inv_full, dx, dy,
170 dz, 2000, T(1e-8));
171 {
172 T psi_000 = std::fmax(psi_full(std::array<size_t, 3>{0, 0, 0}), T(1e-8));
173 T new_chi = T(1) / std::pow(psi_000, T(4));
174 grid.chi = {new_chi};
175 }
176 auto chi_ctx = ChiContext<T>::compute(X, dx, dy, dz, gamma_ij, dgamma_phys, metric);
178 chi_ctx, gamma_tilde_inv, tilde_Gamma, christoffel_tilde, gamma_tilde);
179
180
182 chi_ctx, gamma_tilde, gamma_tilde_inv, christoffel_tilde);
183
184 auto Ricci = RicciPhysicalTensor<T>::compute_Ricci_total(chi_ctx, gamma_tilde, gamma_tilde_inv,
185 tilde_Gamma, christoffel_tilde);
186
187 grid.alpha = {alpha};
188 grid.beta = {beta};
189 grid.gamma_ij = {gamma_ij};
190 grid.gamma_ij_inv = {gamma_ij_inv};
191 grid.chi = {chi};
192 grid.gamma_tilde = {gamma_tilde};
193 grid.gamma_tilde_inv = {gamma_tilde_inv};
194 grid.dgamma_tilde = {dgamma_tilde};
195 grid.christoffel_tilde = {christoffel_tilde};
196 grid.tilde_Gamma = {tilde_Gamma};
197 grid.contracted_Gamma = {contracted_Gamma};
198 grid.ExtrinsicTensor = {Kij};
199 grid.A_tildeTensor = {AtildeTensor};
200
201 std::cout << std::setprecision(6) << std::fixed;
202 std::cout << "\n========= BSSN Quantities at X =========\n";
203
204 std::cout << "--- alpha ---\n" << grid.alpha[0] << "\n";
205 print_vector("beta", grid.beta[0]);
206
207 std::cout << "dbeta\n";
208 d_beta.print();
209
210 print_tensor2("gamma_ij", grid.gamma_ij[0]);
211 print_tensor2("gamma_ij_inv", grid.gamma_ij_inv[0]);
212
213 print_tensor2("gamma_tilde", grid.gamma_tilde[0]);
214 print_tensor2("gamma_tilde_inv", grid.gamma_tilde_inv[0]);
215
216 print_tensor3("dgamma_tilde", grid.dgamma_tilde[0]);
217 print_tensor3("christoffel_tilde", grid.christoffel_tilde[0]);
218 print_vector("tilde_Gamma", grid.tilde_Gamma[0]);
219
220 print_tensor2("∂_t gamma_ij (dgt)", dgt);
221 print_vector("contracted_Gamma", grid.contracted_Gamma[0]);
222
223 print_tensor3("dgamma_phys", dgamma_phys);
224 print_tensor3("christoffel_phys", christoffel_phys);
225 print_tensor2("Extrinsic curvature K_ij", grid.ExtrinsicTensor[0]);
226 print_tensor2("A_tilde_ij", grid.A_tildeTensor[0]);
227 std::cout << "--- chi ---\n" << grid.chi[0] << "\n";
228
229 print_tensor2("Full Ricci R_ij", Ricci_tilde);
230 print_tensor2("Ricci chi total term", Ricci_chi);
231 print_tensor2("Ricci physical tensor", Ricci);
232
233 std::cout << "========================================\n\n";
234 }
235};
236} // namespace tensorium_RG
Computes the conformal Ricci tensor contributions from the conformal factor in the BSSN formalism.
Computes the conformal part of the Ricci tensor in the BSSN formalism.
static FrontendPluginRegistry::Add< TensoriumPluginAction > X("tensorium-dispatch", "Handle #pragma tensorium directives")
Register the plugin under the name "tensorium-dispatch".
Multi-dimensional tensor class with fixed rank and SIMD support.
Definition Tensor.hpp:25
Computes the trace-free conformal extrinsic curvature tensor in the BSSN formalism.
Definition BSSNAtildeTensor.hpp:26
tensorium::Tensor< K, 2 > compute_Atilde_tensor(const tensorium::Tensor< K, 2 > &Kij, const tensorium::Tensor< K, 2 > &gamma_inv, const tensorium::Tensor< K, 2 > &gamma, K chi)
Computes from , , and .
Definition BSSNAtildeTensor.hpp:45
static tensorium::Vector< T > compute(const tensorium::Vector< T > &X, const tensorium_RG::Metric< T > &metric, T dx, T dy, T dz, T chi)
Compute the contracted Christoffel symbol .
Definition BSSNContractedChristoffel.hpp:25
Driver class to initialize and store BSSN variables from an input spacetime metric.
Definition BSSNSetup.hpp:81
BSSNGrid grid
Definition BSSNSetup.hpp:83
void init_BSSN(const tensorium::Vector< T > &X, const tensorium_RG::Metric< T > &metric, T dx, T dy, T dz)
Definition BSSNSetup.hpp:85
static tensorium::Tensor< T, 3 > solveLichnerowicz(const tensorium::Tensor< T, 5 > &Atilde, const tensorium::Tensor< T, 5 > &g_tilde_inv, T dx, T dy, T dz, int max_iter=1000, T tol=T(1e-8))
Solve the Lichnerowicz equation to enforce the Hamiltonian constraint in BSSN.
Definition BSSNConstraintsSolver.hpp:24
Computes the extrinsic curvature tensor from BSSN variables.
Definition BSSNextrinTensor.hpp:46
tensorium::Tensor< T, 2 > compute_Kij(const tensorium::Tensor< T, 2 > &dgt, const tensorium::Tensor< T, 2 > &gamma, const tensorium::Vector< T > &beta, const tensorium::Tensor< T, 2 > &partial_beta, const tensorium::Tensor< T, 3 > &christoffel, const T alpha)
Computes the extrinsic curvature tensor .
Definition BSSNextrinTensor.hpp:73
A callable 4D metric class for general relativity (Minkowski, Schwarzschild, Kerr,...
Definition Metric.hpp:27
T compute_conformal_factor(const tensorium::Tensor< T, 2 > &gamma) const
Definition Metric.hpp:101
void BSSN(const tensorium::Vector< T > &X, T &alpha, tensorium::Vector< T > &beta, tensorium::Tensor< T, 2 > &gamma) const
Extract BSSN 3+1 variables (lapse, shift, and spatial metric)
Definition Metric.hpp:83
static tensorium::Tensor< T, 2 > compute_Ricci_chi_total(const ChiContext< T > &chi_context, const tensorium::Tensor< T, 2 > &gamma_tilde, const tensorium::Tensor< T, 2 > &gamma_tilde_inv, const tensorium::Tensor< T, 3 > &christoffel_tilde)
Computes the total contribution as:
Definition BSSNRicciConformalTensor.hpp:173
static tensorium::Tensor< T, 2 > compute_Ricci_total(const ChiContext< T > &chi_context, const tensorium::Tensor< T, 2 > &gamma_tilde, const tensorium::Tensor< T, 2 > &gamma_tilde_inv, const tensorium::Vector< T > &tilde_Gamma, const tensorium::Tensor< T, 3 > &christoffel_tilde)
Compute the full Ricci tensor as the sum of and .
Definition BSSNRicciComplete.hpp:69
static tensorium::Tensor< T, 2 > compute_Ricci_Tilde_tensor(const ChiContext< T > &chi_context, const tensorium::Tensor< T, 2 > &gamma_tilde_inv, const tensorium::Vector< T > &tilde_Gamma, const tensorium::Tensor< T, 3 > &christoffel_tilde, const tensorium::Tensor< T, 2 > &gamma_tilde)
Combine all four contributions to compute the conformal Ricci tensor:
Definition BSSNRicciTildeTensor.hpp:222
static void compute(const tensorium::Tensor< T, 2 > &gamma_tilde_inv, const tensorium::Tensor< T, 3 > &christoffel, tensorium::Vector< T > &tildeGamma)
Computes .
Definition BSSNTildeChristoffel.hpp:57
Definition BSSNAtildeTensor.hpp:10
void print_tensor3(const std::string &name, const tensorium::Tensor< T, 3 > &tensor)
Definition BSSNPrintDebug.hpp:21
void print_vector(const std::string &name, const tensorium::Vector< T > &vec)
Definition BSSNPrintDebug.hpp:34
auto autodiff(const tensorium::Vector< T > &X, T dx, T dy, T dz, FieldFunc &&func, DiffMode mode, const tensorium::Tensor< T, 3 > &christoffel={})
Definition BSSNAutoDiff.hpp:94
void print_tensor2(const std::string &name, const tensorium::Tensor< T, 2 > &tensor)
Definition BSSNPrintDebug.hpp:11
Storage structure for all evolved BSSN variables on a single grid point or patch.
Definition BSSNSetup.hpp:47
std::vector< tensorium::Vector< double > > beta
Shift vector .
Definition BSSNSetup.hpp:50
std::vector< tensorium::Tensor< double, 2 > > gamma_ij
Physical 3-metric .
Definition BSSNSetup.hpp:51
std::vector< double > alpha
Lapse function .
Definition BSSNSetup.hpp:49
std::vector< double > chi
Conformal factor .
Definition BSSNSetup.hpp:53
std::vector< tensorium::Tensor< double, 2 > > gamma_ij_inv
Inverse .
Definition BSSNSetup.hpp:52
std::vector< tensorium::Tensor< double, 2 > > gamma_tilde
Conformal metric .
Definition BSSNSetup.hpp:55
std::vector< tensorium::Tensor< double, 2 > > ExtrinsicTensor
Extrinsic curvature .
Definition BSSNSetup.hpp:62
std::vector< tensorium::Vector< double > > contracted_Gamma
Contracted symbols.
Definition BSSNSetup.hpp:68
std::vector< tensorium::Vector< double > > tilde_Gamma
Conformal contracted symbols .
Definition BSSNSetup.hpp:66
std::vector< tensorium::Tensor< double, 3 > > christoffel_tilde
Christoffel symbols .
Definition BSSNSetup.hpp:61
std::vector< tensorium::Tensor< double, 3 > > dgamma_tilde
Derivatives .
Definition BSSNSetup.hpp:59
std::vector< tensorium::Tensor< double, 2 > > A_tildeTensor
Trace-free extrinsic curvature .
Definition BSSNSetup.hpp:64
std::vector< tensorium::Tensor< double, 2 > > gamma_tilde_inv
Inverse .
Definition BSSNSetup.hpp:57
std::vector< tensorium::Tensor< double, 5 > > ricci_tilde
Definition BSSNSetup.hpp:69
static ChiContext< T > compute(const tensorium::Vector< T > &X_, T dx_, T dy_, T dz_, const tensorium::Tensor< T, 2 > &g_phys, const tensorium::Tensor< T, 3 > &d_g_phys, const Metric< T > &metric_)
Definition BSSNChiContext.hpp:20