19 double det = M[0][0] * M[1][1] * M[2][2] - M[0][0] * M[1][2] * M[2][1] - M[1][0] * M[0][1] * M[2][2]
20 + M[1][0] * M[0][2] * M[2][1] + M[2][0] * M[0][1] * M[1][2]
21 - M[2][0] * M[0][2] * M[1][1];
23 iM[0][0] = (M[1][1] * M[2][2] - M[1][2] * M[2][1]) / det;
24 iM[0][1] = (M[0][2] * M[2][1] - M[0][1] * M[2][2]) / det;
25 iM[0][2] = (M[0][1] * M[1][2] - M[0][2] * M[1][1]) / det;
26 iM[1][0] = (M[1][2] * M[2][0] - M[1][0] * M[2][2]) / det;
27 iM[1][1] = (M[0][0] * M[2][2] - M[0][2] * M[2][0]) / det;
28 iM[1][2] = (M[0][2] * M[1][0] - M[0][0] * M[1][2]) / det;
29 iM[2][0] = (M[1][0] * M[2][1] - M[1][1] * M[2][0]) / det;
30 iM[2][1] = (M[0][1] * M[2][0] - M[0][0] * M[2][1]) / det;
31 iM[2][2] = (M[0][0] * M[1][1] - M[0][1] * M[1][0]) / det;
53 constexpr double tolerance = 1e-10;
54 constexpr double third = 1. / 3.;
55 constexpr double i27 = 1. / 27.;
58 double rho = d * sqrt(1. - v2);
59 double c3 = 1. - gam * (1. - v2);
60 double c2 = gam * rho + .5 * b2 * (1 + v2) - e;
61 double c0 = -0.5 * sb2;
63 double c2ic3 = c2 / c3;
64 if (std::abs(c0) < 1.0e-20) {
67 double c2ic33 = c2ic3 * c2ic3 * c2ic3;
68 double q = c0 / c3 + 2.0 * i27 * c2ic33;
69 double p = -third * c2ic3 * c2ic3;
70 double sqrtdet = std::sqrt(0.25 * q * q + i27 * p * p * p);
71 w[0] = -third * c2ic3 + std::pow(-0.5 * q + sqrtdet, third) + std::pow(-0.5 * q - sqrtdet, third);
83 double dc2 = 0.5 * (b2 - gam * rho / (1.0 - v2));
85 double dlogw = (dc3 * w[0] + dc2) / (3.0 * c3 * w[0] + 2.0 * c2);
86 double wb = w[0] + b2;
87 double vb2 = sb2 / (w[0] * w[0]);
88 f[0] = wb * wb * v2 - (2.0 * w[0] + b2) * vb2 - s2;
89 df[0] = wb * (wb + 2.0 * dlogw * (w[0] * v2 + vb2));
110 double xacc2 = 1e-60;
117 if (std::abs(FL) < xacc2) {
124 if (std::abs(FH) < xacc2) {
148 v2[0] = .5 * (X1[0] + X2[0]);
149 double dxOld = std::abs(X2[0] - X1[0]);
155 constexpr int MaxIt = 400;
156 for (
int j = 0; j < MaxIt; j++) {
157 if ((((v2[0] - XH) * DF - F) * ((v2[0] - XL) * DF - F) > 0.) or (std::abs(2 * F) > std::abs(dxOld * DF))) {
159 dx = 0.5 * (XH - XL);
174 if (std::abs(dx) < XACC[0]) {
188 if (std::abs(F) < xacc2) {
201 constexpr double gamma = 4.0 / 3.0;
204 double v_cov[3] = {V[1], V[2], V[3]};
206 double B_contr[3] = {V[5], V[6], V[7]};
213 double g_cov[3][3] = {{V[13], V[14], V[15]}, {V[14], V[16], V[17]}, {V[15], V[17], V[18]}};
215 double g_contr[3][3];
228 double vxB_cov[3] = {
229 gp * (v_contr[1] * B_contr[2] - v_contr[2] * B_contr[1]),
230 gp * (v_contr[2] * B_contr[0] - v_contr[0] * B_contr[2]),
231 gp * (v_contr[0] * B_contr[1] - v_contr[1] * B_contr[0])
235 double vxB_contr[3] = {
236 gm * (v_cov[1] * B_cov[2] - v_cov[2] * B_cov[1]),
237 gm * (v_cov[2] * B_cov[0] - v_cov[0] * B_cov[2]),
238 gm * (v_cov[0] * B_cov[1] - v_cov[1] * B_cov[0])
241 double vb = v_cov[0] * B_contr[0] + v_cov[1] * B_contr[1] + v_cov[2] * B_contr[2];
242 double v2 = v_contr[0] * v_cov[0] + v_contr[1] * v_cov[1] + v_contr[2] * v_cov[2];
243 double e2 = vxB_contr[0] * vxB_cov[0] + vxB_contr[1] * vxB_cov[1] + vxB_contr[2] * vxB_cov[2];
244 double b2 = B_contr[0] * B_cov[0] + B_contr[1] * B_cov[1] + B_contr[2] * B_cov[2];
246 double uem = 0.5 * (b2 + e2);
248 double lf = 1.0 / sqrt(1.0 - v2);
249 double gamma1 = gamma / (gamma - 1.0);
250 double w = rho + gamma1 * p;
251 double ww = w * lf * lf;
254 Q[Shortcuts::rho] = gp * rho * lf;
255 Q[Shortcuts::vel + 0] = gp * ww * v_cov[0] + b2 * v_cov[0] - vb * B_cov[0];
256 Q[Shortcuts::vel + 1] = gp * ww * v_cov[1] + b2 * v_cov[1] - vb * B_cov[1];
257 Q[Shortcuts::vel + 2] = gp * ww * v_cov[2] + b2 * v_cov[2] - vb * B_cov[2];
258 Q[Shortcuts::E] = gp * ww - p + uem - Q[Shortcuts::rho];
259 Q[Shortcuts::B + 0] = gp * V[Shortcuts::B + 0];
260 Q[Shortcuts::B + 1] = gp * V[Shortcuts::B + 1];
261 Q[Shortcuts::B + 2] = gp * V[Shortcuts::B + 2];
264 Q[Shortcuts::psi] = V[Shortcuts::psi];
265 Q[Shortcuts::lapse] = V[Shortcuts::lapse];
266 Q[Shortcuts::shift + 0] = V[Shortcuts::shift + 0];
267 Q[Shortcuts::shift + 1] = V[Shortcuts::shift + 1];
268 Q[Shortcuts::shift + 2] = V[Shortcuts::shift + 2];
269 Q[Shortcuts::gij + 0] = V[Shortcuts::gij + 0];
270 Q[Shortcuts::gij + 1] = V[Shortcuts::gij + 1];
271 Q[Shortcuts::gij + 2] = V[Shortcuts::gij + 2];
272 Q[Shortcuts::gij + 3] = V[Shortcuts::gij + 3];
273 Q[Shortcuts::gij + 4] = V[Shortcuts::gij + 4];
274 Q[Shortcuts::gij + 5] = V[Shortcuts::gij + 5];
281 constexpr double gamma = 4.0 / 3.0;
282 constexpr double p_floor = 1.0e-16;
283 constexpr double rho_floor = 1.0e-10;
285 constexpr double igamma = 1.0 / gamma;
286 constexpr int NSTOV_kappa = 100;
289 constexpr double NSTOV_p_atmo = 1e-12;
290 constexpr double NSTOV_rho_atmo = 1e-11;
295 double psi = Q[Shortcuts::psi];
296 double lapse = Q[Shortcuts::lapse];
297 double shift[3] = {Q[Shortcuts::shift + 0], Q[Shortcuts::shift + 1], Q[Shortcuts::shift + 2]};
298 double gammaij[6] = {
299 Q[Shortcuts::gij + 0],
300 Q[Shortcuts::gij + 1],
301 Q[Shortcuts::gij + 2],
302 Q[Shortcuts::gij + 3],
303 Q[Shortcuts::gij + 4],
304 Q[Shortcuts::gij + 5]
306 double g_cov[3][3] = {
308 {Q[13], Q[14], Q[15]},
309 {Q[14], Q[16], Q[17]},
310 {Q[15], Q[17], Q[18]}
317 double g_contr[3][3];
324 for (
int i = 0; i < 8; i++) {
330 double B_contr[3] = {
335 double sm_cov[3] = {Qloc[1], Qloc[2], Qloc[3]};
337 double gamma1 = gamma / (gamma - 1.0);
338 double gam = 1.0 / gamma1;
348 double s2 = sm_cov[0] * sm[0] + sm_cov[1] * sm[1] + sm_cov[2] * sm[2];
349 double b2 = B_contr[0] * B_cov[0] + B_contr[1] * B_cov[1] + B_contr[2] * B_cov[2];
350 double sb = sm_cov[0] * B_contr[0] + sm_cov[1] * B_contr[1] + sm_cov[2] * B_contr[2];
351 double sb2 = sb * sb;
355 double e = Qloc[4] + dd;
357 double eps = 1.0e-10;
366 double x2 = 1.0 - 1e-10;
367 double tol = 1.0e-18;
370 RTSAFE_C2P_RMHD1(&v2, &x1, &x2, &tol, &w, gam, dd, e, s2, b2, sb2, &failed);
372 double p, rho, den, vb;
377 rho = NSTOV_rho_atmo;
383 den = 1.0 / (w + b2);
385 rho = dd * sqrt(1. - v2);
386 v_cov[0] = (sm_cov[0] + vb * B_cov[0]) * den;
387 v_cov[1] = (sm_cov[1] + vb * B_cov[1]) * den;
388 v_cov[2] = (sm_cov[2] + vb * B_cov[2]) * den;
389 p = gam * (w * (1. - v2) - rho);
392 if (rho < NSTOV_rho_atmo * 1.01) {
397 rho = NSTOV_rho_atmo;
398 p = gam * (w * (1. - v2) - rho);
400 if (p < NSTOV_p_atmo * 1.01) {
405 p = gam * (w * (1. - v2) - rho);
408 if (p < NSTOV_p_atmo) {
426 for (
int i = 0; i < 6; i++) {
427 V[13 + i] = gammaij[i];