11#pragma once
22
3+ #include " ../Derivatives/BSSNGridDerivatives.hpp"
34#include " ../Fields/BSSNGridSoA.hpp"
45#include " Tensorium_Grid/Grid/GridLayout.hpp"
56
89 * @brief RHS for the conformal metric \f$\tilde{\gamma}_{ij}\f$.
910 * @details Evaluates
1011 * \f[
11- * \partial_t\tilde{\gamma}_{ij} = -2\alpha\tilde{A}_{ij} + \mathcal{L}_\beta \tilde{\gamma}_{ij} - \tfrac{2}{3}\tilde{\gamma}_{ij}\partial_k\beta^k + \mathcal{D}_6[\tilde{\gamma}_{ij}].
12+ * \partial_t\tilde{\gamma}_{ij} = -2\alpha\tilde{A}_{ij} + \mathcal{L}_\beta \tilde{\gamma}_{ij} -
13+ * \tfrac{2}{3}\tilde{\gamma}_{ij}\partial_k\beta^k + \mathcal{D}_6[\tilde{\gamma}_{ij}].
1214 * \f]
13- * Lie derivatives expand into \f$\tilde{\gamma}_{ik}\partial_j\beta^k + \tilde{\gamma}_{jk}\partial_i\beta^k\f$ plus the advection term \f$\beta^k\partial_k\tilde{\gamma}_{ij}\f$.
15+ * Lie derivatives expand into \f$\tilde{\gamma}_{ik}\partial_j\beta^k +
16+ * \tilde{\gamma}_{jk}\partial_i\beta^k\f$ plus the advection term
17+ * \f$\beta^k\partial_k\tilde{\gamma}_{ij}\f$.
1418 */
1519
1620namespace tensorium_RG ::bssn {
1721
1822#ifndef TENSORIUM_BSSN_EVOLUTION_CLAMP_HELPERS_DEFINED
19- #define TENSORIUM_BSSN_EVOLUTION_CLAMP_HELPERS_DEFINED
23+ # define TENSORIUM_BSSN_EVOLUTION_CLAMP_HELPERS_DEFINED
2024inline size_t clamped_lower (size_t lower, size_t guard, size_t upper) {
2125 return std::min (lower + guard, upper);
2226}
@@ -32,11 +36,12 @@ inline size_t clamped_upper(size_t upper, size_t guard, size_t lower) {
3236template <typename T>
3337inline void compute_rhs_gamma_tilde (const BSSNGridSoA<T> &G, Field3D<T> rhs[6 ],
3438 size_t padding = 4 ) {
39+ using namespace tensorium_RG ::fd;
3540 size_t I0 , I1 , J0 , J1 , K0 , K1 ;
3641 G.domain_bounds (I0 , I1 , J0 , J1 , K0 , K1 );
3742
38- const size_t total = G. gamma_tilde [ 0 ]. st . nx_tot * G. gamma_tilde [ 0 ]. st . ny_tot *
39- G.gamma_tilde [0 ].st .nz_tot ;
43+ const size_t total =
44+ G. gamma_tilde [ 0 ]. st . nx_tot * G. gamma_tilde [ 0 ]. st . ny_tot * G.gamma_tilde [0 ].st .nz_tot ;
4045 for (int s = 0 ; s < 6 ; ++s)
4146 std::fill (rhs[s].ptr (), rhs[s].ptr () + total, T (0 ));
4247
@@ -50,58 +55,65 @@ inline void compute_rhs_gamma_tilde(const BSSNGridSoA<T> &G, Field3D<T> rhs[6],
5055 if (i0 >= i1 || j0 >= j1 || k0 >= k1)
5156 return ;
5257
53- const T ko_sigma = T (5.0 );
58+ const T ko_sigma = T (0.6 );
5459
5560#pragma omp parallel for collapse(3)
56- for (size_t i = i0; i < i1; ++i)
57- for (size_t j = j0; j < j1; ++j)
61+ for (size_t i = i0; i < i1; ++i) {
62+ for (size_t j = j0; j < j1; ++j) {
5863 for (size_t k = k0; k < k1; ++k) {
5964 const size_t id = G.gamma_tilde [0 ].idx (i, j, k);
60- const T alpha = G.alpha .ptr ()[id];
61-
62- const T div_beta = tensorium_RG::fd::Dx (G.beta [0 ], i, j, k, G.dx ) +
63- tensorium_RG::fd::Dy (G.beta [1 ], i, j, k, G.dy ) +
64- tensorium_RG::fd::Dz (G.beta [2 ], i, j, k, G.dz );
65-
66- auto d_beta = [&](int idx, size_t dir_i, size_t dir_j, size_t dir_k) {
67- if (idx == 0 )
68- return tensorium_RG::fd::Dx (G.beta [dir_i], i, j, k, dir_j == 0 ? G.dx : G.dy );
69- if (idx == 1 )
70- return tensorium_RG::fd::Dy (G.beta [dir_i], i, j, k, dir_j == 1 ? G.dy : G.dz );
71- return tensorium_RG::fd::Dz (G.beta [dir_i], i, j, k, G.dz );
72- };
73-
74- const T beta_x = G.beta [0 ].ptr ()[id];
75- const T beta_y = G.beta [1 ].ptr ()[id];
76- const T beta_z = G.beta [2 ].ptr ()[id];
65+ const T alpha = G.alpha .ptr ()[id];
66+
67+ T d_beta[3 ][3 ];
68+ d_beta[0 ][0 ] = Dx (G.beta [0 ], i, j, k, G.dx );
69+ d_beta[0 ][1 ] = Dy (G.beta [0 ], i, j, k, G.dy );
70+ d_beta[0 ][2 ] = Dz (G.beta [0 ], i, j, k, G.dz );
71+ d_beta[1 ][0 ] = Dx (G.beta [1 ], i, j, k, G.dx );
72+ d_beta[1 ][1 ] = Dy (G.beta [1 ], i, j, k, G.dy );
73+ d_beta[1 ][2 ] = Dz (G.beta [1 ], i, j, k, G.dz );
74+ d_beta[2 ][0 ] = Dx (G.beta [2 ], i, j, k, G.dx );
75+ d_beta[2 ][1 ] = Dy (G.beta [2 ], i, j, k, G.dy );
76+ d_beta[2 ][2 ] = Dz (G.beta [2 ], i, j, k, G.dz );
77+
78+ const T div_beta = d_beta[0 ][0 ] + d_beta[1 ][1 ] + d_beta[2 ][2 ];
79+ const T beta_vec[3 ] = {G.beta [0 ].ptr ()[id], G.beta [1 ].ptr ()[id],
80+ G.beta [2 ].ptr ()[id]};
81+
82+ T gam[3 ][3 ];
83+ for (int u = 0 ; u < 3 ; ++u)
84+ for (int v = u; v < 3 ; ++v) {
85+ T val = G.gamma_tilde [tensorium_RG::sym6_index (u, v)].ptr ()[id];
86+ gam[u][v] = val;
87+ gam[v][u] = val;
88+ }
7789
78- for (int a = 0 ; a < 3 ; ++a)
90+ for (int a = 0 ; a < 3 ; ++a) {
7991 for (int b = a; b < 3 ; ++b) {
8092 const int s = tensorium_RG::sym6_index (a, b);
81- const T gamma = G.gamma_tilde [s].ptr ()[id];
82- T adv = beta_x * tensorium_RG::fd::Dx_upwind (G.gamma_tilde [s], i, j, k, G.dx , beta_x) +
83- beta_y * tensorium_RG::fd::Dy_upwind (G.gamma_tilde [s], i, j, k, G.dy , beta_y) +
84- beta_z * tensorium_RG::fd::Dz_upwind (G.gamma_tilde [s], i, j, k, G.dz , beta_z);
93+
94+ T adv = beta_vec[0 ] * tensorium_RG::fd::Dx_upwind (G.gamma_tilde [s], i, j, k,
95+ G.dx , beta_vec[0 ]) +
96+ beta_vec[1 ] * tensorium_RG::fd::Dy_upwind (G.gamma_tilde [s], i, j, k,
97+ G.dy , beta_vec[1 ]) +
98+ beta_vec[2 ] * tensorium_RG::fd::Dz_upwind (G.gamma_tilde [s], i, j, k,
99+ G.dz , beta_vec[2 ]);
100+
85101 T lie = T (0 );
86- lie += G.gamma_tilde [tensorium_RG::sym6_index (a, 0 )].ptr ()[id] *
87- tensorium_RG::fd::Dx (G.beta [b], i, j, k, G.dx );
88- lie += G.gamma_tilde [tensorium_RG::sym6_index (b, 0 )].ptr ()[id] *
89- tensorium_RG::fd::Dx (G.beta [a], i, j, k, G.dx );
90- lie += G.gamma_tilde [tensorium_RG::sym6_index (a, 1 )].ptr ()[id] *
91- tensorium_RG::fd::Dy (G.beta [b], i, j, k, G.dy );
92- lie += G.gamma_tilde [tensorium_RG::sym6_index (b, 1 )].ptr ()[id] *
93- tensorium_RG::fd::Dy (G.beta [a], i, j, k, G.dy );
94- lie += G.gamma_tilde [tensorium_RG::sym6_index (a, 2 )].ptr ()[id] *
95- tensorium_RG::fd::Dz (G.beta [b], i, j, k, G.dz );
96- lie += G.gamma_tilde [tensorium_RG::sym6_index (b, 2 )].ptr ()[id] *
97- tensorium_RG::fd::Dz (G.beta [a], i, j, k, G.dz );
98-
99- const T result = adv - T (2 ) * alpha * G.A_tilde [s].ptr ()[id] + lie -
100- T (2.0 / 3.0 ) * gamma * div_beta +
101- T (tensorium_RG::fd::KO6 (G.gamma_tilde [s], i, j, k, ko_sigma));
102- rhs[s].ptr ()[id] = result;
102+ for (int m = 0 ; m < 3 ; ++m) {
103+ lie += gam[a][m] * d_beta[m][b];
104+ lie += gam[b][m] * d_beta[m][a];
105+ }
106+
107+ const T source = -T (2 ) * alpha * G.A_tilde [s].ptr ()[id];
108+ const T trace_rem = -T (2.0 / 3.0 ) * gam[a][b] * div_beta;
109+ const T diss =
110+ T (tensorium_RG::fd::KO6 (G.gamma_tilde [s], i, j, k, ko_sigma));
111+
112+ rhs[s].ptr ()[id] = adv + lie + source + trace_rem + diss;
103113 }
114+ }
104115 }
116+ }
117+ }
105118}
106-
107119} // namespace tensorium_RG::bssn
0 commit comments