14 double *cmin,
double *cmax,
int beg,
int end)
24 for (i = beg; i <= end; i++) {
26 if (err != 0)
return i;
34 int Magnetosonic (
double *vp,
double cs2,
double h,
double *lambda)
129 double vB, vB2, Bm2, vm2, w, w_1;
130 double eps2, one_m_eps2, a2_w;
131 double vx, vx2, u0, u02;
132 double a4, a3, a2, a1, a0;
133 double scrh1, scrh2,
scrh;
134 double b2, del, z[4];
136 #if RMHD_FAST_EIGENVALUES
141 scrh = fabs(vp[
VXn])/sqrt(cs2);
146 Bm2 = EXPAND(vp[BX1]*vp[BX1], + vp[BX2]*vp[BX2], + vp[BX3]*vp[BX3]);
150 print (
"! MAGNETOSONIC: |v|= %f > 1\n",u02);
167 w_1 = 1.0/(vp[
RHO]*h + Bm2);
168 eps2 = cs2 + Bm2*w_1*(1.0 - cs2);
169 a0 = cs2*vp[
BXn]*vp[
BXn]*w_1;
171 del = a1*a1 - 4.0*a0;
174 lambda[
KFASTP] = sqrt(0.5*(-a1 + del));
177 lambda[KSLOWP] = sqrt(0.5*(-a1 - del));
178 lambda[KSLOWM] = -lambda[KSLOWP];
184 u02 = 1.0/(1.0 - u02);
187 w_1 = 1.0/(vp[
RHO]*h + b2);
191 if (fabs(vp[
BXn]) < 1.e-14){
194 scrh1 = b2 + cs2*(w - vB2);
195 scrh2 = w*(1.0 - cs2)*u02;
196 del = 4.0*scrh1*(scrh2*(1.0 - vx2) + scrh1);
201 lambda[
KFASTP] = 0.5*(-a1 + sqrt(del))/a2;
202 lambda[
KFASTM] = 0.5*(-a1 - sqrt(del))/a2;
204 lambda[KSLOWP] = lambda[KSLOWM] = vp[
VXn];
211 scrh1 = vp[
BXn]/u02 + vB*vx;
215 eps2 = (cs2*vp[
RHO]*h + b2)*w_1;
216 one_m_eps2 = u02*vp[
RHO]*h*(1.0 - cs2)*w_1;
222 scrh = 2.0*(a2_w*vB*scrh1 - eps2*vx);
223 a4 = one_m_eps2 - a2_w*vB2 + eps2;
224 a3 = - 4.0*vx*one_m_eps2 +
scrh;
225 a2 = 6.0*vx2*one_m_eps2 + a2_w*(vB2 - scrh2) + eps2*(vx2 - 1.0);
226 a1 = - 4.0*vx*vx2*one_m_eps2 -
scrh;
227 a0 = vx2*vx2*one_m_eps2 + a2_w*scrh2 - eps2*vx2;
230 print (
"! Magnetosonic: cannot divide by a4\n");
243 print (
"! Magnetosonic: Cannot find max speed [dir = %d]\n",
g_dir);
245 print (
"! prs = %12.6e\n",vp[PRS]);
246 EXPAND(
print (
"! vx = %12.6e\n",vp[VX1]); ,
247 print (
"! vy = %12.6e\n",vp[VX2]); ,
248 print (
"! vz = %12.6e\n",vp[VX3]);)
249 EXPAND(print (
"! Bx = %12.6e\n",vp[BX1]); ,
250 print (
"! By = %12.6e\n",vp[BX2]); ,
251 print (
"! Bz = %12.6e\n",vp[BX3]);)
252 print (
"! f(x) = %12.6e + x*(%12.6e + x*(%12.6e ",
253 a0*a4, a1*a4, a2*a4);
254 print (
" + x*(%12.6e + x*%12.6e)))\n", a3*a4, a4);
269 lambda[KSLOWP] = z[2];
270 lambda[KSLOWM] = z[1];
285 double vel2, lor2, Bmag2, b2, ca2, om2, vB2;
286 double vB,
scrh, vl, vx, vx2;
289 vB = EXPAND(v[VX1]*v[
BX1], + v[VX2]*v[
BX2], + v[VX3]*v[
BX3]);
290 Bmag2 = EXPAND(v[BX1]*v[BX1], + v[BX2]*v[BX2], + v[BX3]*v[BX3]);
293 print (
"! Eigenavalues(): |v|^2 = %f > 1\n",vel2);
300 b2 = Bmag2*(1.0 -
vel2) + vB2;
301 ca2 = b2/(v[
RHO]*h + b2);
303 om2 = cs2 + ca2 - cs2*ca2;
304 vl = vx*(1.0 - om2)/(1.0 - vel2*om2);
305 scrh = om2*(1.0 -
vel2)*((1.0 - vel2*om2) - vx2*(1.0 - om2));
306 scrh = sqrt(scrh)/(1.0 - vel2*om2);
310 if (fabs(lambda[
KFASTM])>1.0 || fabs(lambda[
KFASTP]) > 1.0){
311 print (
"! Eigenvalues(): vm, vp = %8.3e, %8.3e\n",lambda[KFASTM],lambda[KFASTP]);
314 if (lambda[KFASTM] != lambda[KFASTM] || lambda[KFASTP] != lambda[KFASTP]){
315 print (
"! Eigenvalues(): nan, vm, vp = %8.3e, %8.3e\n",lambda[KFASTM],lambda[KFASTP]);
319 scrh = fabs(vx)/sqrt(cs2);
329 #define DEBUG_MODE NO
400 int nv, mu,
k, indx[
NFLX];
401 int degen1 = 0, degen2[
NFLX];
402 double vB, Bmag2,
eta, b2, E;
403 double eta_1, e_P, rho_P, rho_S;
404 double a, A, B, betay, betaz;
405 double u[4], b[4], l[4], f[4], d[4];
406 double la[4], lB[4], fa[4], fB[4];
408 double s, Ru[10], col[
NFLX];
411 #if DEBUG_MODE == YES
423 printf (
"AA = %12.6e\n",q[
BXn]/sqrt(q[
BXn]*q[
BXn] + q[
RHO]*h));
429 u[0] = 1.0/sqrt(1.0 - u[0]);
433 EXPAND(u[1] = u[0]*q[
VXn]; ,
434 u[2] = u[0]*q[
VXt]; ,
438 EXPAND(b[1] = q[
BXn]/u[0] + b[0]*q[
VXn]; ,
439 b[2] = q[
BXt]/u[0] + b[0]*q[
VXt]; ,
440 b[3] = q[
BXb]/u[0] + b[0]*q[
VXb];)
441 b2 = Bmag2/(u[0]*u[0]) + vB*vB;
453 rho_P = a*q[
RHO]/q[PRS];
461 MAGNETOSONIC (q, cs2, h, lambda);
462 lambda[KALFVP] = (b[1] + u[1]*sqrt(E))/(b[0] + u[0]*sqrt(E));
463 lambda[KALFVM] = (b[1] - u[1]*sqrt(E))/(b[0] - u[0]*sqrt(E));
466 #if DIVB_CONTROL != EIGHT_WAVES
475 for (k = 0; k <
NFLX; k++) degen2[k] = 0;
478 if (fabs(q[
BXn]) < 1.e-9*B){
481 if (fabs(lambda[KALFVM] - lambda[
KFASTM]) < 1.e-6)
484 if (fabs(lambda[KALFVP] - lambda[
KFASTP]) < 1.e-6)
487 if (fabs(lambda[KALFVM] - lambda[KSLOWM]) < 1.e-6)
490 if (fabs(lambda[KALFVP] - lambda[KSLOWP]) < 1.e-6)
495 #if DEBUG_MODE == YES
496 PRINT_STATE(q,lambda,cs2,h);
513 la[mu] = (eta - e_P*b2)*u[mu]*eta_1;
514 lB[mu] = b[mu]*eta_1;
515 fa[mu] = b[mu]*e_P*eta_1;
516 fB[mu] = -u[mu]*eta_1;
523 for (k = 0; k <
NFLX; k++){
524 if (k != KFASTM && k != KFASTP)
continue;
526 a = u[0]*(q[
VXn] - lambda[
k]);
527 B = -b[0]*lambda[
k] + b[1];
530 #if DEBUG_MODE == YES
531 printf (
"FAST, a = %12.6e, A = %12.6e, B = %12.6e\n",a,A,B);
535 EXPAND(phi[1] = 1.0;, phi[2] = 0.0;, phi[3] = 0.0;)
539 d[mu] = B*b[mu] - b2*(phi[mu] + a*u[mu]);
543 l[mu] = phi[mu] + la[mu]*a + lB[mu]*B;
544 f[mu] = fa[mu]*a + fB[mu]*B;
545 d[mu] = a*(B*f[mu] - a*l[mu])
546 + (B*B - e_P*b2*a*a)*(phi[mu] + 2.0*a*u[mu])*eta_1;
552 Ru[4+mu] = B*d[mu] + a*A*f[mu];
559 RR[
RHO][
k] = rho_P*Ru[8] + rho_S*Ru[9];
560 EXPAND(RR[
VXn][k] = (-q[
VXn]*Ru[0] + Ru[1])/u[0]; ,
561 RR[
VXt][
k] = (-q[
VXt]*Ru[0] + Ru[2])/u[0]; ,
562 RR[
VXb][
k] = (-q[
VXb]*Ru[0] + Ru[3])/u[0];)
566 RR[
BXt][k] = b[2]*Ru[0] - b[0]*Ru[2] - u[2]*Ru[4] + u[0]*Ru[6]; ,
567 RR[
BXb][
k] = b[3]*Ru[0] - b[0]*Ru[3] - u[3]*Ru[4] + u[0]*Ru[7];)
580 if (Bmag2 < 1.e-9*q[PRS]){
581 betay = betaz = 1.0/sqrt(2.0);
587 A = q[
VXt]*betay + q[
VXb]*betaz;
590 b[2] = betay/u[0] + u[2]*A;
591 b[3] = betaz/u[0] + u[3]*A;
593 b2 = (betay*betay + betaz*betaz)/(u[0]*u[0]) + A*A;
595 #if DEBUG_MODE == YES
596 printf (
"!!!! Degen 1: Bx -> 0, b^2 = %12.6e\n", b2);
600 for (k = 0; k <
NFLX; k++){
601 if (k != KSLOWP && k != KSLOWM)
continue;
617 Ru[8] = - b2*sqrt(Bmag2);
621 a = u[0]*(q[
VXn] - lambda[
k]);
622 B = -b[0]*lambda[
k] + b[1];
625 #if DEBUG_MODE == YES
626 printf (
"SLOW, a = %12.6e, A = %12.6e, B = %12.6e\n",a,A,B);
629 EXPAND(phi[1] = 1.0;, phi[2] = 0.0;, phi[3] = 0.0;)
634 d[mu] = B*b[mu] - b2*(phi[mu] + a*u[mu]);
638 l[mu] = phi[mu] + la[mu]*a + lB[mu]*B;
639 f[mu] = fa[mu]*a + fB[mu]*B;
640 d[mu] = a*(B*f[mu] - a*l[mu])
641 + (B*B - e_P*b2*a*a)*(phi[mu] + 2.0*a*u[mu])*eta_1;
647 Ru[4+mu] = B*d[mu] + a*A*f[mu];
655 RR[
RHO][
k] = rho_P*Ru[8] + rho_S*Ru[9];
656 EXPAND(RR[
VXn][k] = (-q[
VXn]*Ru[0] + Ru[1])/u[0]; ,
657 RR[
VXt][
k] = (-q[
VXt]*Ru[0] + Ru[2])/u[0]; ,
658 RR[
VXb][
k] = (-q[
VXb]*Ru[0] + Ru[3])/u[0];)
662 RR[
BXt][k] = b[2]*Ru[0] - b[0]*Ru[2] - u[2]*Ru[4] + u[0]*Ru[6]; ,
663 RR[
BXb][
k] = b[3]*Ru[0] - b[0]*Ru[3] - u[3]*Ru[4] + u[0]*Ru[7];)
699 for (k = 0; k <
NFLX; k++){
700 if (k != KALFVP && k != KALFVM)
continue;
702 a = u[0]*(q[
VXn] - lambda[
k]);
703 B = -b[0]*lambda[
k] + b[1];
705 EXPAND(phi[1] = 1.0;, phi[2] = 0.0;, phi[3] = 0.0;)
707 Ru[0] = (u[2]*b[3] - u[3]*b[2]);
708 Ru[1] = lambda[
k]*(u[2]*b[3] - u[3]*b[2]);
709 Ru[2] = -lambda[
k]*(u[1]*b[3] - u[3]*b[1])
710 + (u[0]*b[3] - u[3]*b[0]);
711 Ru[3] = lambda[
k]*(u[1]*b[2] - u[2]*b[1])
712 - (u[0]*b[2] - u[2]*b[0]);
715 if (degen1 && k == KALFVP) s = 1.0;
716 if (degen1 && k == KALFVM) s = -1.0;
727 EXPAND(RR[
VXn][k] = (-q[
VXn]*Ru[0] + Ru[1])/u[0]; ,
728 RR[
VXt][
k] = (-q[
VXt]*Ru[0] + Ru[2])/u[0]; ,
729 RR[
VXb][
k] = (-q[
VXb]*Ru[0] + Ru[3])/u[0];)
733 RR[
BXt][k] = b[2]*Ru[0] - b[0]*Ru[2] - u[2]*Ru[4] + u[0]*Ru[6]; ,
734 RR[
BXb][
k] = b[3]*Ru[0] - b[0]*Ru[3] - u[3]*Ru[4] + u[0]*Ru[7];)
751 #if DIVB_CONTROL != EIGHT_WAVES
762 for (nv = NFLX; nv--; ){
763 for (k = NFLX; k--; ){
764 tmp[nv][
k] = RR[nv][
k];
767 #if DEBUG_MODE == YES
773 for (nv = NFLX; nv--; ){
774 for (k = NFLX; k--; ){
775 RR[nv][
k] = LL[
k][nv] = (k == nv ? 1.0:0.0);
778 #if DIVB_CONTROL != EIGHT_WAVES
779 LL[KDIVB][
BXn] = RR[
BXn][KDIVB] = 0.0;
785 for (mu = 0; mu <
NFLX; mu++){
786 for (k = 0; k <
NFLX; k++) col[k] = 0.0;
789 for (k = 0; k <
NFLX; k++) LL[k][mu] = col[k];
793 #if DIVB_CONTROL != EIGHT_WAVES
794 LL[KDIVB][
BXn] = RR[
BXn][KDIVB] = 0.0;
798 #if DEBUG_MODE == YES
799 printf (
"-------------------------------\n");
800 printf (
" INVERSE MATRIX\n");
801 printf (
"-------------------------------\n");
808 void PrimToChar (
double **Lp,
double *
v,
double *w)
812 for (k = NFLX; k--; ){
814 for (nv = NFLX; nv--; ){
815 w[
k] += Lp[
k][nv]*v[nv];
821 int PRINT_STATE(
double *q,
double *lambda,
double cs2,
double hh)
824 printf (
"q[RHO] = %12.6e;\n", q[
RHO]);
825 printf (
"q[VXn] = %12.6e;\n", q[
VXn]);
826 printf (
"q[VXt] = %12.6e;\n", q[
VXt]);
827 printf (
"q[VXb] = %12.6e;\n", q[
VXb]);
829 printf (
"q[BXn] = %12.6e;\n", q[BXn]);
830 printf (
"q[BXt] = %12.6e;\n", q[
BXt]);
831 printf (
"q[BXb] = %12.6e;\n", q[
BXb]);
833 printf (
"q[PRS] = %12.6e;\n", q[PRS]);
834 printf (
"cs2 = %12.6e; hh = %12.6e;\n",cs2,hh);
837 printf (
"fm, %d %12.6e\n", KFASTM, lambda[KFASTM]);
838 printf (
"am, %d %12.6e\n", KALFVM, lambda[KALFVM]);
839 printf (
"sm, %d %12.6e\n", KSLOWM, lambda[KSLOWM]);
841 printf (
"sp, %d %12.6e\n", KSLOWP, lambda[KSLOWP]);
842 printf (
"ap, %d %12.6e\n", KALFVP, lambda[KALFVP]);
843 printf (
"fp, %d %12.6e\n", KFASTP, lambda[KFASTP]);
int QuarticSolve(double, double, double, double, double *)
void Eigenvalues(double **v, double *csound2, double **lambda, int beg, int end)
void PRIM_EIGENVECTORS(double *, double, double, double *, double **, double **)
void ShowMatrix(double **, int n, double)
double g_maxMach
The maximum Mach number computed during integration.
void LUBackSubst(double **a, int n, int *indx, double b[])
int g_dir
Specifies the current sweep or direction of integration.
void print(const char *fmt,...)
void PrimToChar(double **L, double *v, double *w)
void MaxSignalSpeed(double **v, double *cs2, double *cmin, double *cmax, int beg, int end)
#define ARRAY_2D(nx, ny, type)
int LUDecompose(double **a, int n, int *indx, double *d)
#define QUIT_PLUTO(e_code)
int Magnetosonic(double *vp, double cs2, double h, double *lambda)