17#define FAC sin(al)*sin(be)*sin(al)*sin(be)*sin(al)*sin(be)
21static inline double min (
double const x,
double const y)
30 int i1 = i, j1 = j, k1 = k;
35 i1 = 2 *
n1 - (i1 + 1);
40 j1 = 2 *
n2 - (j1 + 1);
47 return ivar +
nvar * (i1 +
n1 * (j1 +
n2 * k1));
88 int i, j, k, ivar, N, *indx;
89 double *p, *dp, *d2p, *q, *dq, *r, *dr;
101 for (ivar = 0; ivar <
nvar; ivar++)
103 for (k = 0; k <
n3; k++)
105 for (j = 0; j <
n2; j++)
107 for (i = 0; i <
n1; i++)
110 p[i] =
v.d0[indx[i]];
117 for (i = 0; i <
n1; i++)
119 v.d1[indx[i]] = dp[i];
120 v.d11[indx[i]] = d2p[i];
124 for (k = 0; k <
n3; k++)
126 for (i = 0; i <
n1; i++)
128 for (j = 0; j <
n2; j++)
131 p[j] =
v.d0[indx[j]];
132 q[j] =
v.d1[indx[j]];
142 for (j = 0; j <
n2; j++)
144 v.d2[indx[j]] = dp[j];
145 v.d22[indx[j]] = d2p[j];
146 v.d12[indx[j]] = dq[j];
150 for (i = 0; i <
n1; i++)
152 for (j = 0; j <
n2; j++)
154 for (k = 0; k <
n3; k++)
157 p[k] =
v.d0[indx[k]];
158 q[k] =
v.d1[indx[k]];
159 r[k] =
v.d2[indx[k]];
172 for (k = 0; k <
n3; k++)
174 v.d3[indx[k]] = dp[k];
175 v.d33[indx[k]] = d2p[k];
176 v.d13[indx[k]] = dq[k];
177 v.d23[indx[k]] = dr[k];
202 int i, j, k, ivar, indx;
203 double al, be, A, B, X, R, x, r, phi, y, z, Am1, *values;
210 sources=
new double[
n1*
n2*
n3]();
213 double *s_x, *s_y, *s_z;
215 s_x =
new double[
n1*
n2*
n3]();
216 s_y =
new double[
n1*
n2*
n3]();
217 s_z =
new double[
n1*
n2*
n3]();
218 for (i = 0; i <
n1; i++)
219 for (j = 0; j <
n2; j++)
220 for (k = 0; k <
n3; k++)
224 al = Pih * (2 * i + 1) /
n1;
226 be = Pih * (2 * j + 1) /
n2;
228 phi = 2. * Pi * k /
n3;
231 for (ivar = 0; ivar <
nvar; ivar++)
234 U.
d0[ivar] = Am1 *
v.d0[indx];
235 U.
d1[ivar] =
v.d0[indx] + Am1 *
v.d1[indx];
236 U.
d2[ivar] = Am1 *
v.d2[indx];
237 U.
d3[ivar] = Am1 *
v.d3[indx];
238 U.
d11[ivar] = 2 *
v.d1[indx] + Am1 *
v.d11[indx];
239 U.
d12[ivar] =
v.d2[indx] + Am1 *
v.d12[indx];
240 U.
d13[ivar] =
v.d3[indx] + Am1 *
v.d13[indx];
241 U.
d22[ivar] = Am1 *
v.d22[indx];
242 U.
d23[ivar] = Am1 *
v.d23[indx];
243 U.
d33[ivar] = Am1 *
v.d33[indx];
262 for (i = 0; i <
n1; i++)
263 for (j = 0; j <
n2; j++)
264 for (k = 0; k <
n3; k++)
268 double psi, psi2, psi4, psi7, r_plus, r_minus;
269 FILE *debugfile = NULL;
272 debugfile = fopen(
"res.dat",
"w");
275 for (i = 0; i <
n1; i++)
277 for (j = 0; j <
n2; j++)
279 for (k = 0; k <
n3; k++)
282 al = Pih * (2 * i + 1) /
n1;
284 be = Pih * (2 * j + 1) /
n2;
286 phi = 2. * Pi * k /
n3;
289 for (ivar = 0; ivar <
nvar; ivar++)
292 U.
d0[ivar] = Am1 *
v.d0[indx];
293 U.
d1[ivar] =
v.d0[indx] + Am1 *
v.d1[indx];
294 U.
d2[ivar] = Am1 *
v.d2[indx];
295 U.
d3[ivar] = Am1 *
v.d3[indx];
296 U.
d11[ivar] = 2 *
v.d1[indx] + Am1 *
v.d11[indx];
297 U.
d12[ivar] =
v.d2[indx] + Am1 *
v.d12[indx];
298 U.
d13[ivar] =
v.d3[indx] + Am1 *
v.d13[indx];
299 U.
d22[ivar] = Am1 *
v.d22[indx];
300 U.
d23[ivar] = Am1 *
v.d23[indx];
301 U.
d33[ivar] = Am1 *
v.d33[indx];
313 A, B, X, R, x, r, phi, y, z, U, values);
314 for (ivar = 0; ivar <
nvar; ivar++)
317 F[indx] = values[ivar] * FAC;
320 u.d0[indx] = U.
d0[ivar];
321 u.d1[indx] = U.
d1[ivar];
322 u.d2[indx] = U.
d2[ivar];
323 u.d3[indx] = U.
d3[ivar];
324 u.d11[indx] = U.
d11[ivar];
325 u.d12[indx] = U.
d12[ivar];
326 u.d13[indx] = U.
d13[ivar];
327 u.d22[indx] = U.
d22[ivar];
328 u.d23[indx] = U.
d23[ivar];
329 u.d33[indx] = U.
d33[ivar];
331 if (debugfile && (k==0))
333 r_plus = sqrt ((x -
par_b) * (x -
par_b) + y * y + z * z);
334 r_minus = sqrt ((x +
par_b) * (x +
par_b) + y * y + z * z);
341 psi7 = psi * psi2 * psi4;
343 "%.16g %.16g %.16g %.16g %.16g %.16g %.16g %.16g\n",
344 (
double)x, (
double)y, (
double)A, (
double)B,
349 (2.0 * Pi / psi2/psi * sources[indx]) * FAC),
353 (
double)(-(2.0 * Pi / psi2/psi * sources[indx]) * FAC),
354 (
double)sources[indx]
379 int i, j, k, ivar, indx;
380 double al, be, A, B, X, R, x, r, phi, y, z, Am1, *values;
386 for (i = 0; i <
n1; i++)
391 for (j = 0; j <
n2; j++)
393 for (k = 0; k <
n3; k++)
396 al = Pih * (2 * i + 1) /
n1;
398 be = Pih * (2 * j + 1) /
n2;
400 phi = 2. * Pi * k /
n3;
403 for (ivar = 0; ivar <
nvar; ivar++)
406 dU.
d0[ivar] = Am1 * dv.
d0[indx];
407 dU.
d1[ivar] = dv.
d0[indx] + Am1 * dv.
d1[indx];
408 dU.
d2[ivar] = Am1 * dv.
d2[indx];
409 dU.
d3[ivar] = Am1 * dv.
d3[indx];
410 dU.
d11[ivar] = 2 * dv.
d1[indx] + Am1 * dv.
d11[indx];
411 dU.
d12[ivar] = dv.
d2[indx] + Am1 * dv.
d12[indx];
412 dU.
d13[ivar] = dv.
d3[indx] + Am1 * dv.
d13[indx];
413 dU.
d22[ivar] = Am1 * dv.
d22[indx];
414 dU.
d23[ivar] = Am1 * dv.
d23[indx];
415 dU.
d33[ivar] = Am1 * dv.
d33[indx];
416 U.
d0[ivar] =
u.d0[indx];
417 U.
d1[ivar] =
u.d1[indx];
418 U.
d2[ivar] =
u.d2[indx];
419 U.
d3[ivar] =
u.d3[indx];
420 U.
d11[ivar] =
u.d11[indx];
421 U.
d12[ivar] =
u.d12[indx];
422 U.
d13[ivar] =
u.d13[indx];
423 U.
d22[ivar] =
u.d22[indx];
424 U.
d23[ivar] =
u.d23[indx];
425 U.
d33[ivar] =
u.d33[indx];
436 LinEquations (A, B, X, R, x, r, phi, y, z, dU, U, values);
437 for (ivar = 0; ivar <
nvar; ivar++)
440 Jdv[indx] = values[ivar] * FAC;
460 double al, be, A, B, X, R, x, r, phi, y, z, Am1;
461 double sin_al, sin_al_i1, sin_al_i2, sin_al_i3, cos_al;
462 double sin_be, sin_be_i1, sin_be_i2, sin_be_i3, cos_be;
463 double dV0, dV1, dV2, dV3, dV11, dV12, dV13, dV22, dV23, dV33,
464 ha, ga, ga2, hb, gb, gb2, hp, gp, gp2, gagb, gagp, gbgp;
498 sin_al_i1 = 1 / sin_al;
499 sin_be_i1 = 1 / sin_be;
500 sin_al_i2 = sin_al_i1 * sin_al_i1;
501 sin_be_i2 = sin_be_i1 * sin_be_i1;
502 sin_al_i3 = sin_al_i1 * sin_al_i2;
503 sin_be_i3 = sin_be_i1 * sin_be_i2;
508 for (ivar = 0; ivar <
nvar; ivar++)
531 dV1 = 0.5 * ga * (dv.
d0[ipcc] - dv.
d0[imcc]);
532 dV2 = 0.5 * gb * (dv.
d0[icpc] - dv.
d0[icmc]);
533 dV3 = 0.5 * gp * (dv.
d0[iccp] - dv.
d0[iccm]);
534 dV11 = ga2 * (dv.
d0[ipcc] + dv.
d0[imcc] - 2 * dv.
d0[iccc]);
535 dV22 = gb2 * (dv.
d0[icpc] + dv.
d0[icmc] - 2 * dv.
d0[iccc]);
536 dV33 = gp2 * (dv.
d0[iccp] + dv.
d0[iccm] - 2 * dv.
d0[iccc]);
538 0.25 * gagb * (dv.
d0[ippc] - dv.
d0[ipmc] + dv.
d0[immc] - dv.
d0[impc]);
540 0.25 * gagp * (dv.
d0[ipcp] - dv.
d0[imcp] + dv.
d0[imcm] - dv.
d0[ipcm]);
542 0.25 * gbgp * (dv.
d0[icpp] - dv.
d0[icpm] + dv.
d0[icmm] - dv.
d0[icmp]);
544 dV11 = sin_al_i3 * (sin_al * dV11 - cos_al * dV1);
545 dV12 = sin_al_i1 * sin_be_i1 * dV12;
546 dV13 = sin_al_i1 * dV13;
547 dV22 = sin_be_i3 * (sin_be * dV22 - cos_be * dV2);
548 dV23 = sin_be_i1 * dV23;
549 dV1 = sin_al_i1 * dV1;
550 dV2 = sin_be_i1 * dV2;
552 dU.
d0[ivar] = Am1 * dV0;
553 dU.
d1[ivar] = dV0 + Am1 * dV1;
554 dU.
d2[ivar] = Am1 * dV2;
555 dU.
d3[ivar] = Am1 * dV3;
556 dU.
d11[ivar] = 2 * dV1 + Am1 * dV11;
557 dU.
d12[ivar] = dV2 + Am1 * dV12;
558 dU.
d13[ivar] = dV3 + Am1 * dV13;
559 dU.
d22[ivar] = Am1 * dV22;
560 dU.
d23[ivar] = Am1 * dV23;
561 dU.
d33[ivar] = Am1 * dV33;
564 U.
d0[ivar] =
u.d0[indx];
565 U.
d1[ivar] =
u.d1[indx];
566 U.
d2[ivar] =
u.d2[indx];
567 U.
d3[ivar] =
u.d3[indx];
568 U.
d11[ivar] =
u.d11[indx];
569 U.
d12[ivar] =
u.d12[indx];
570 U.
d13[ivar] =
u.d13[indx];
571 U.
d22[ivar] =
u.d22[indx];
572 U.
d23[ivar] =
u.d23[indx];
573 U.
d33[ivar] =
u.d33[indx];
584 LinEquations (A, B, X, R, x, r, phi, y, z, dU, U, values);
585 for (ivar = 0; ivar <
nvar; ivar++)
595 int *ncols,
int **cols,
double **Matrix)
598 int column, row, mcol;
599 int i, i1, i_0, i_1, j, j1, j_0, j_1, k, k1, k_0, k_1, N1, N2, N3,
611 for (i = 0; i <
n1; i++)
613 for (j = 0; j <
n2; j++)
615 for (k = 0; k <
n3; k++)
617 for (ivar = 0; ivar <
nvar; ivar++)
626 for (i = 0; i <
n1; i++)
628 for (j = 0; j <
n2; j++)
630 for (k = 0; k <
n3; k++)
632 for (ivar = 0; ivar <
nvar; ivar++)
650 for (i1 = i_0; i1 <= i_1; i1++)
652 for (j1 = j_0; j1 <= j_1; j1++)
654 for (k1 = k_0; k1 <= k_1; k1++)
658 for (ivar1 = 0; ivar1 <
nvar; ivar1++)
660 if (values[ivar1] != 0)
664 cols[row][mcol] = column;
665 Matrix[row][mcol] = values[ivar1];
689 double *p, *values1, **values2, result;
694 values2 =
dmatrix (0, N, 0, N);
696 for (k = 0; k <
n3; k++)
698 for (j = 0; j <
n2; j++)
700 for (i = 0; i <
n1; i++)
701 p[i] =
v[ivar +
nvar * (i +
n1 * (j +
n2 * k))];
703 values2[j][k] =
chebev (-1, 1, p,
n1, A);
707 for (k = 0; k <
n3; k++)
709 for (j = 0; j <
n2; j++)
710 p[j] = values2[j][k];
712 values1[k] =
chebev (-1, 1, p,
n2, B);
730 double al = Pih * (2 * i + 1) /
n1, be = Pih * (2 * j + 1) /
n2,
731 sin_al = sin (al), sin2_al = sin_al * sin_al, cos_al = cos (al),
732 sin_be = sin (be), sin2_be = sin_be * sin_be, cos_be = cos (be);
754 + a *
v.d1[0] + b *
v.d2[0] + c *
v.d3[0]
755 + 0.5 * a * a *
v.d11[0] + a * b *
v.d12[0] + a * c *
v.d13[0]
756 + 0.5 * b * b *
v.d22[0] + b * c *
v.d23[0] + 0.5 * c * c *
v.d33[0];
767 double xs, ys, zs, rs2, phi, X, R, A, B, al, be, aux1, aux2, a, b, c,
776 rs2 = ys * ys + zs * zs;
781 aux1 = 0.5 * (xs * xs + rs2 - 1);
782 aux2 = sqrt (aux1 * aux1 + rs2);
783 X = asinh (sqrt (aux1 + aux2));
784 R = asin (
min(1.0, sqrt (-aux1 + aux2)));
788 A = 2 * tanh (0.5 * X) - 1;
789 B = tan (0.5 * R - Piq);
793 i = rint (al *
n1 / Pi - 0.5);
794 j = rint (be *
n2 / Pi - 0.5);
795 k = rint (0.5 * phi *
n3 / Pi);
797 a = al - Pi * (i + 0.5) /
n1;
798 b = be - Pi * (j + 0.5) /
n2;
799 c = phi - 2 * Pi * k /
n3;
805 Ui = (A - 1) * result;
814 const int n2,
const int n3,
derivs v,
double x,
double y,
818 double xs, ys, zs, rs2, phi, X, R, A, B, aux1, aux2, result, Ui;
823 rs2 = ys * ys + zs * zs;
828 aux1 = 0.5 * (xs * xs + rs2 - 1);
829 aux2 = sqrt (aux1 * aux1 + rs2);
830 X = asinh (sqrt (aux1 + aux2));
831 R = asin (
min(1.0, sqrt (-aux1 + aux2)));
835 A = 2 * tanh (0.5 * X) - 1;
836 B = tan (0.5 * R - Piq);
840 Ui = (A - 1) * result;
856 double *p, *values1, **values2, result;
863 values2 =
dmatrix (0, N, 0, N);
865 for (k = 0; k <
n3; k++)
867 for (j = 0; j <
n2; j++)
869 for (i = 0; i <
n1; i++) p[i] =
v[ivar +
nvar * (i +
n1 * (j +
n2 * k))];
871 values2[j][k] =
chebev (-1, 1, p,
n1, A);
875 for (k = 0; k <
n3; k++)
877 for (j = 0; j <
n2; j++) p[j] = values2[j][k];
879 values1[k] =
chebev (-1, 1, p,
n2, B);
900 for (
int i=2;i<m;i++)
902 recvec[i] = 2*x*recvec[i-1] - recvec[i-2];
908 double result = -0.5*coeff[0];
910#pragma omp simd reduction(+:result)
911 for (
int i=0;i<m;i++)
913 result += recvec[i]*coeff[i];
934 for (
int k = 0; k <
npoints_phi; k++) values2[j][k] = -0.5* _d0contig[myglob++];
940#pragma omp simd safelen(4)
944 values2[j][k] += _recvec[i]*_d0contig[index];
953 for (
int j = 0; j <
npoints_B; j++) p[j] = values2[j][k];
985 for (
int k = 0; k <
npoints_phi_low; k++) values2[j][k] = -0.5* _d0contig_low[myglob++];
991#pragma omp simd safelen(4)
995 const int index = k + j*
n3 + i*
n3*
n2;
997 values2[j][k] += _recvec[i]*_d0contig[index];
1007 for (
int j = 0; j <
npoints_B_low; j++) p[j] = values2[j][k];
1030 double xs, ys, zs, rs2, phi, X, R, A, B, aux1, aux2, result, Ui;
1036 rs2 = ys * ys + zs * zs;
1041 aux1 = 0.5 * (xs * xs + rs2 - 1);
1042 aux2 = sqrt (aux1 * aux1 + rs2);
1043 X = asinh (sqrt (aux1 + aux2));
1044 R = asin (
min(1.0, sqrt (-aux1 + aux2)));
1048 A = 2 * tanh (0.5 * X) - 1;
1049 B = tan (0.5 * R - Piq);
1054 Ui = (A - 1) * result;
1066 int i, j, k, N, n, l, m;
1067 double *p, ***values3, ***values4;
1080 for(i=0;i<
n1;i++) p[i]=
v[ivar + (i +
n1 * (j +
n2 * k))];
1083 for (n=0;n<
n1;n++) {
1084 values3[n][j][k] = p[n];
1091 for (n = 0; n <
n1; n++){
1093 for(j=0;j<
n2;j++) p[j]=values3[n][j][k];
1095 for (l = 0; l <
n2; l++){
1096 values4[n][l][k] = p[l];
1102 for (i = 0; i <
n1; i++){
1103 for (j = 0; j <
n2; j++){
1104 for(k=0;k<
n3;k++) p[k]=values4[i][j][k];
1106 for (k = 0; k<
n3; k++){
1107 cf[ivar + (i +
n1 * (j +
n2 * k))] = p[k];
void free_derivs(derivs *v, int n)
void Derivatives_AB3(int nvar, int n1, int n2, int n3, derivs v)
void JFD_times_dv(int i, int j, int k, int nvar, int n1, int n2, int n3, derivs dv, derivs u, double *values)
void SpecCoef(int n1, int n2, int n3, int ivar, double *v, double *cf)
void NonLinEquations(double rho_adm, double A, double B, double X, double R, double x, double r, double phi, double y, double z, derivs U, double *values)
double PunctEvalAtArbitPositionFasterLowRes(double A, double B, double phi)
void F_of_v(int nvar, int n1, int n2, int n3, derivs v, double *F, derivs u)
double PunctEvalAtArbitPositionFast(double *v, int ivar, double A, double B, double phi, int nvar, int n1, int n2, int n3)
Fast Spectral Interpolation Routine Stuff.
void AB_To_XR(int nvar, double A, double B, double *X, double *R, derivs U)
void rx3_To_xyz(int nvar, double x, double r, double phi, double *y, double *z, derivs U)
void calculate_derivs(int i, int j, int k, int ivar, int nvar, int n1, int n2, int n3, derivs v, derivs vv)
double PunctTaylorExpandAtArbitPosition(int ivar, int nvar, int n1, int n2, int n3, derivs v, double x, double y, double z)
double PunctEvalAtArbitPositionFaster(double A, double B, double phi)
void J_times_dv(int nvar, int n1, int n2, int n3, derivs dv, double *Jdv, derivs u)
double PunctIntPolAtArbitPosition(int ivar, int nvar, int n1, int n2, int n3, derivs v, double x, double y, double z)
void SetMatrix_JFD(int nvar, int n1, int n2, int n3, derivs u, int *ncols, int **cols, double **Matrix)
double interpol(double a, double b, double c, derivs v)
void allocate_derivs(derivs *v, int n)
void LinEquations(double A, double B, double X, double R, double x, double r, double phi, double y, double z, derivs dU, derivs U, double *values)
double PunctEvalAtArbitPosition(double *v, int ivar, double A, double B, double phi, int nvar, int n1, int n2, int n3)
int Index(int ivar, int i, int j, int k, int nvar, int n1, int n2, int n3)
double PunctIntPolAtArbitPositionFast(derivs v, double x, double y, double z, bool low_res=false)
void C_To_c(int nvar, double X, double R, double *x, double *r, derivs U)
void fourft(double *u, int N, int inv)
double chebev(double a, double b, double c[], int m, double x)
int maximum3(int i, int j, int k)
int maximum2(int i, int j)
double * dvector(long nl, long nh)
void free_dvector(double *v, long nl, long nh)
void free_ivector(int *v, long nl, long nh)
void chebft_Zeros(double u[], int n, int inv)
void fourder2(double u[], double d2u[], int N)
int minimum2(int i, int j)
void chder(double *c, double *cder, int n)
double *** d3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh)
int * ivector(long nl, long nh)
void fourder(double u[], double du[], int N)
double fourev(double *u, int N, double x)
double ** dmatrix(long nrl, long nrh, long ncl, long nch)
void free_d3tensor(double ***t, long nrl, long nrh, long ncl, long nch, long ndl, long ndh)
void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch)
This file contains aliases for making access to the long state vector Q as used eg.
double chebev_wrec(double recvec[], double coeff[], int m)
static double min(double const x, double const y)
void recurrence(double x, int m, double *recvec)
static constexpr int npoints_phi
static constexpr int npoints_A
static constexpr int npoints_B_low
static constexpr int npoints_phi_low
static constexpr int npoints_B
static constexpr int npoints_A_low
bool do_residuum_debug_output