36 double **bgf,
int beg,
int end)
52 double gpr, Bmag2, Btmag2;
57 for (i = beg; i <= end; i++) {
67 gpr = cs2[
i]*v[
i][
RHO];
72 EXPAND (b1 = v[i][
BXn]; ,
77 EXPAND (b1 += bgf[i][
BXn]; ,
81 Btmag2 = b2*b2 + b3*b3;
82 Bmag2 = b1*b1 + Btmag2;
85 cf = gpr + Bmag2 + sqrt(cf*cf + 4.0*gpr*Btmag2);
86 cf = sqrt(0.5*cf/v[i][
RHO]);
87 cmin[
i] = v[
i][
VXn] - cf;
88 cmax[
i] = v[
i][
VXn] + cf;
111 double scrh0, scrh1, scrh2, scrh3, scrh4;
112 double u,
a, a2, ca2, cf2, cs2;
113 double cs,
ca, cf, b2, A2, At2;
117 for (i = beg; i <= end; i++){
122 sqrt_rho = sqrt(q[
RHO]);
135 scrh0 = sqrt(scrh1*scrh1 + 4.0*a2*At2);
139 cf2 = 0.5*(a2 + A2 + scrh0);
155 #if DIVB_CONTROL == EIGHT_WAVES
156 lambda[
i][KDIVB] = u;
158 lambda[
i][KDIVB] = 0.0;
163 lambda[
i][KSLOWM] = u - cs;
164 lambda[
i][KSLOWP] = u + cs;
168 lambda[
i][KALFVM] = u -
ca;
169 lambda[
i][KALFVP] = u +
ca;
180 double **LL,
double **RR)
228 #define sqrt_1_2 (0.70710678118654752440)
231 double scrh0, scrh1, scrh2, scrh3, scrh4;
232 double u,
a, ca2, cf2, cs2;
233 double cs,
ca, cf, b2, A2, At2;
235 double alpha_f, alpha_s, beta_y, beta_z;
238 #if BACKGROUND_FIELD == YES
239 print1 (
"! Background field does not support characteristic limiting\n");
245 sqrt_rho = sqrt(q[
RHO]);
256 scrh0 = sqrt(scrh1*scrh1 + 4.0*a2*At2);
260 cf2 = 0.5*(a2 + A2 + scrh0);
273 alpha_f = (a2 - cs2)*scrh0;
274 alpha_s = (cf2 - a2)*scrh0;
276 alpha_f =
MAX(0.0, alpha_f);
277 alpha_s =
MAX(0.0, alpha_s);
279 alpha_f = sqrt(alpha_f);
280 alpha_s = sqrt(alpha_s);
286 beta_y =
DSIGN(q[BXt]); ,
287 beta_y = q[
BXt] / scrh0;
288 beta_z = q[
BXb] / scrh0;)
295 S = (q[
BXn] >= 0.0 ? 1.0 : -1.0);
310 scrh0 = alpha_s*cs*S;
311 scrh1 = alpha_s*sqrt_rho*
a;
316 EXPAND(RR[
VXn][k] = -cf*alpha_f; ,
317 RR[
VXt][
k] = scrh0*beta_y; ,
318 RR[
VXb][
k] = scrh0*beta_z;)
320 RR[
BXt][
k] = scrh1*beta_y; ,
321 RR[
BXb][
k] = scrh1*beta_z;)
325 scrh4 = alpha_f*a2*q[RHO];
329 #if EOS == ISOTHERMAL
330 LL[
k][
RHO] = 0.5*alpha_f/q[
RHO];
332 EXPAND(LL[k][
VXn] = RR[
VXn][k]*scrh2; ,
339 LL[k][PRS] = alpha_f*scrh3;
356 RR[PRS][k] = RR[PRS][
KFASTM];
359 #if EOS == ISOTHERMAL
369 LL[k][PRS] = LL[
KFASTM][PRS];
382 LL[
k][PRS] = - 1.0/a2;
391 #if DIVB_CONTROL == EIGHT_WAVES
408 scrh0 = alpha_f*cf*S;
409 scrh1 = alpha_f*sqrt_rho*
a;
412 EXPAND(RR[
VXn][k] = -cs*alpha_s; ,
413 RR[
VXt][
k] = -scrh0*beta_y; ,
414 RR[
VXb][
k] = -scrh0*beta_z;)
416 RR[
BXt][
k] = -scrh1*beta_y; ,
417 RR[
BXb][
k] = -scrh1*beta_z;)
420 scrh4 = alpha_s*a2*q[RHO];
424 #if EOS == ISOTHERMAL
425 LL[
k][
RHO] = 0.5*alpha_s/q[
RHO];
427 EXPAND(LL[k][
VXn] = RR[
VXn][k]*scrh2; ,
435 LL[k][PRS] = alpha_s*scrh3;
446 EXPAND(RR[
VXn][k] = -RR[
VXn][KSLOWM]; ,
447 RR[
VXt][
k] = -RR[
VXt][KSLOWM]; ,
448 RR[
VXb][
k] = -RR[
VXb][KSLOWM];)
451 RR[
BXt][
k] = RR[
BXt][KSLOWM]; ,
457 #if EOS == ISOTHERMAL
460 EXPAND(LL[k][
VXn] = -LL[KSLOWM][
VXn]; ,
461 LL[
k][
VXt] = -LL[KSLOWM][
VXt]; ,
462 LL[
k][
VXb] = -LL[KSLOWM][
VXb];)
464 LL[
k][
BXt] = LL[KSLOWM][
BXt]; ,
468 LL[k][PRS] = LL[KSLOWM][PRS];
485 RR[
BXt][
k] = -scrh3*sqrt_rho*S;
486 RR[
BXb][
k] = scrh2*sqrt_rho*S;
503 RR[
BXt][
k] = - RR[
BXt][KALFVM];
504 RR[
BXb][
k] = - RR[
BXb][KALFVM];
508 LL[
k][
BXt] = - LL[KALFVM][
BXt];
509 LL[
k][
BXb] = - LL[KALFVM][
BXb];
519 if (q[
BXn] == 0 && q[BXt] == 0.0)
for (k = 0; k <
NFLX; k++) RR[BXt][k] = 0.0;
560 #if CHECK_EIGENVECTORS == YES
562 static double **A, **ALR;
569 print (
"! PrimEigenvectors: eigenvector check requires 3 components\n");
580 for (i = 0; i <
NFLX; i++){
581 for (j = 0; j <
NFLX; j++){
582 A[
i][
j] = ALR[
i][
j] = 0.0;
593 A[PRS][
VXn] = a2*q[
RHO]; A[PRS][PRS] = q[
VXn];
595 #elif EOS == ISOTHERMAL
612 for (i = 0; i <
NFLX; i++){
613 for (j = 0; j <
NFLX; j++){
615 for (k = 0; k <
NFLX; k++){
616 ALR[
i][
j] += RR[
i][
k]*lambda[
k]*LL[
k][
j];
620 for (i = 0; i <
NFLX; i++){
621 for (j = 0; j <
NFLX; j++){
633 if (j ==
BXn)
continue;
634 dA = ALR[
i][
j] - A[
i][
j];
635 if (fabs(dA) > 1.e-8){
636 print (
"! PrimEigenvectors: eigenvectors not consistent\n");
638 print (
"! A[%d][%d] = %16.9e, R.Lambda.L[%d][%d] = %16.9e\n",
639 i,j, A[i][j], i,j,ALR[i][j]);
648 for (i = 0; i <
NFLX; i++){
649 for (j = 0; j <
NFLX; j++){
650 #if (DIVB_CONTROL == NO) || (DIVB_CONTROL == CONSTRAINED_TRANSPORT)
651 if (i == KDIVB || j == KDIVB)
continue;
654 for (k = 0; k <
NFLX; k++) a += LL[i][k]*RR[k][j];
655 if ( (i == j && fabs(a-1.0) > 1.e-8) ||
656 (i != j && fabs(a)>1.e-8) ) {
657 print (
"! PrimEigenvectors: Eigenvectors not orthogonal\n");
658 print (
"! i,j = %d, %d %12.6e \n",i,j,a);
670 double **Lc,
double **Rc,
double *lambda)
709 double beta_y, beta_z;
711 double cf2, cs2, ca2, v2;
712 double cf, cs,
ca,
a;
713 double alpha_f, alpha_s;
714 double g1, g2, tau, Gf, Ga, Gs;
715 double scrh0, scrh1, S, bt2, b2, Btmag;
721 #if BACKGROUND_FIELD == YES
722 print (
"! ConsEigenvectors: Background field does not support\n");
723 print (
" characteristic limiting.\n");
728 print1(
"! ConsEigenvectors: cannot be used presently with PVTE_LAW EoS\n");
740 #if CHECK_EIGENVECTORS == YES
759 #if EOS == BAROTROPIC
760 print (
"! ConsEigenvectors: not defined for barotropic MHD\n");
766 EXPAND (vx = v[
VXn]; ,
770 EXPAND (Bx = v[
BXn]; ,
774 one_sqrho = 1.0/sqrt(rho);
776 S = (Bx >= 0.0 ? 1.0 : -1.0);
778 EXPAND(bx = Bx*one_sqrho; ,
782 bt2 = EXPAND(0.0 , + by*by, + bz*bz);
784 Btmag = sqrt(bt2*rho);
785 v2 = EXPAND(vx*vx , + vy*vy, + vz*vz);
800 scrh0 = scrh0*scrh0 + 4.0*bt2*a2;
803 cf2 = 0.5*(a2 + b2 + scrh0);
813 beta_y =
DSIGN(By); ,
819 beta_z = beta_y = sqrt(0.5);)
832 scrh0 = 1.0/(cf2 - cs2);
833 alpha_f = (a2 - cs2)*scrh0;
834 alpha_s = (cf2 - a2)*scrh0;
835 alpha_f =
MAX(0.0, alpha_f);
836 alpha_s =
MAX(0.0, alpha_s);
837 alpha_f = sqrt(alpha_f);
838 alpha_s = sqrt(alpha_s);
851 #elif EOS == ISOTHERMAL
852 one_gmm = g1 = tau = 0.0;
855 scrh0 = EXPAND(0.0, + beta_y*vy, + beta_z*vz);
856 Gf = alpha_f*cf*vx - alpha_s*cs*S*scrh0;
857 Ga = EXPAND(0.0, , + S*(beta_z*vy - beta_y*vz));
858 Gs = alpha_s*cs*vx + alpha_f*cf*S*scrh0;
867 scrh0 = alpha_s*cs*S;
868 scrh1 = alpha_s*a*one_sqrho;
869 Rc[
RHO][
k] = alpha_f;
870 EXPAND( Rc[
MXn][k] = alpha_f*lambda[k]; ,
871 Rc[
MXt][
k] = alpha_f*vy + scrh0*beta_y; ,
872 Rc[
MXb][
k] = alpha_f*vz + scrh0*beta_z; )
874 Rc[
BXt][
k] = scrh1*beta_y; ,
875 Rc[
BXb][
k] = scrh1*beta_z; )
877 Rc[ENG][k] = alpha_f*(0.5*v2 + cf2 - g2*a2) - Gf;
880 Lc[
k][
RHO] = (g1*alpha_f*v2 + Gf)*0.5/a2;
881 #if EOS == ISOTHERMAL
882 Lc[
k][
RHO] += alpha_f*0.5;
884 EXPAND( Lc[k][
MXn] = (one_gmm*alpha_f*vx - alpha_f*cf) *0.5/a2; ,
885 Lc[
k][
MXt] = (one_gmm*alpha_f*vy + scrh0*beta_y)*0.5/a2; ,
886 Lc[
k][
MXb] = (one_gmm*alpha_f*vz + scrh0*beta_z)*0.5/a2;)
887 EXPAND( Lc[k][
BXn] = LBX*one_gmm*alpha_f*Bx*0.5/a2; ,
888 Lc[
k][
BXt] = (one_gmm*alpha_f*By + scrh1*rho*beta_y)*0.5/a2; ,
889 Lc[
k][
BXb] = (one_gmm*alpha_f*Bz + scrh1*rho*beta_z)*0.5/a2; )
891 Lc[k][ENG] = alpha_f*(
g_gamma - 1.0)*0.5/a2;
901 Rc[
RHO][
k] = alpha_f;
902 EXPAND( Rc[
MXn][k] = alpha_f*lambda[k]; ,
903 Rc[
MXt][
k] = alpha_f*vy - scrh0*beta_y; ,
904 Rc[
MXb][
k] = alpha_f*vz - scrh0*beta_z; )
906 Rc[
BXt][
k] = scrh1*beta_y; ,
907 Rc[
BXb][
k] = scrh1*beta_z; )
909 Rc[ENG][k] = alpha_f*(0.5*v2 + cf2 - g2*a2) + Gf;
912 Lc[
k][
RHO] = (g1*alpha_f*v2 - Gf)*0.5/a2;
913 #if EOS == ISOTHERMAL
914 Lc[
k][
RHO] += alpha_f*0.5;
916 EXPAND( Lc[k][
MXn] = (one_gmm*alpha_f*vx + alpha_f*cf) *0.5/a2; ,
917 Lc[
k][
MXt] = (one_gmm*alpha_f*vy - scrh0*beta_y)*0.5/a2; ,
918 Lc[
k][
MXb] = (one_gmm*alpha_f*vz - scrh0*beta_z)*0.5/a2;)
919 EXPAND( Lc[k][
BXn] = LBX*one_gmm*alpha_f*Bx*0.5/a2; ,
920 Lc[
k][
BXt] = (one_gmm*alpha_f*By + sqrt(rho)*a*alpha_s*beta_y)*0.5/a2; ,
921 Lc[
k][
BXb] = (one_gmm*alpha_f*Bz + sqrt(rho)*a*alpha_s*beta_z)*0.5/a2; )
923 Lc[k][ENG] = alpha_f*(
g_gamma - 1.0)*0.5/a2;
935 EXPAND( Rc[
MXn][k] = vx; ,
940 Lc[
k][
RHO] = 1.0 - 0.5*tau*v2;
941 EXPAND(Lc[k][
VXn] = tau*vx; ,
942 Lc[
k][
VXt] = tau*vy; ,
943 Lc[
k][
VXb] = tau*vz;)
944 EXPAND(Lc[k][
BXn] = LBX*tau*Bx; ,
945 Lc[
k][
BXt] = tau*By; ,
946 Lc[
k][
BXb] = tau*Bz;)
956 #if DIVB_CONTROL == EIGHT_WAVES
974 scrh0 = alpha_f*cf*S;
976 Rc[
RHO][
k] = alpha_s;
977 EXPAND( Rc[
MXn][k] = alpha_s*lambda[k]; ,
978 Rc[
MXt][
k] = alpha_s*vy - scrh0*beta_y; ,
979 Rc[
MXb][
k] = alpha_s*vz - scrh0*beta_z; )
981 Rc[
BXt][
k] = - alpha_f*a*beta_y*one_sqrho; ,
982 Rc[
BXb][
k] = - alpha_f*a*beta_z*one_sqrho; )
985 Rc[ENG][k] = alpha_s*(0.5*v2 + cs2 - g2*a2) - Gs;
988 Lc[
k][
RHO] = (g1*alpha_s*v2 + Gs)*0.5/a2;
990 #if EOS == ISOTHERMAL
991 Lc[
k][
RHO] += alpha_s*0.5;
994 EXPAND( Lc[k][
MXn] = (one_gmm*alpha_s*vx - alpha_s*cs) *0.5/a2; ,
995 Lc[
k][
MXt] = (one_gmm*alpha_s*vy - scrh0*beta_y)*0.5/a2; ,
996 Lc[
k][
MXb] = (one_gmm*alpha_s*vz - scrh0*beta_z)*0.5/a2;)
997 EXPAND( Lc[k][
BXn] = LBX*one_gmm*alpha_s*Bx*0.5/a2; ,
998 Lc[
k][
BXt] = (one_gmm*alpha_s*By - sqrt(rho)*a*alpha_f*beta_y)*0.5/a2; ,
999 Lc[
k][
BXb] = (one_gmm*alpha_s*Bz - sqrt(rho)*a*alpha_f*beta_z)*0.5/a2; )
1001 Lc[k][ENG] = alpha_s*(
g_gamma - 1.0)*0.5/a2;
1009 lambda[
k] = vx + cs;
1011 Rc[
RHO][
k] = alpha_s;
1012 EXPAND( Rc[
MXn][k] = alpha_s*lambda[k]; ,
1013 Rc[
MXt][
k] = alpha_s*vy + scrh0*beta_y; ,
1014 Rc[
MXb][
k] = alpha_s*vz + scrh0*beta_z; )
1016 Rc[
BXt][
k] = - alpha_f*a*beta_y*one_sqrho; ,
1017 Rc[
BXb][
k] = - alpha_f*a*beta_z*one_sqrho; )
1020 Rc[ENG][k] = alpha_s*(0.5*v2 + cs2 - g2*a2) + Gs;
1023 Lc[
k][
RHO] = (g1*alpha_s*v2 - Gs)*0.5/a2;
1025 #if EOS == ISOTHERMAL
1026 Lc[
k][
RHO] += alpha_s*0.5;
1029 EXPAND( Lc[k][
MXn] = (one_gmm*alpha_s*vx + alpha_s*cs) *0.5/a2; ,
1030 Lc[
k][
MXt] = (one_gmm*alpha_s*vy + scrh0*beta_y)*0.5/a2; ,
1031 Lc[
k][
MXb] = (one_gmm*alpha_s*vz + scrh0*beta_z)*0.5/a2;)
1032 EXPAND( Lc[k][
BXn] = LBX*one_gmm*alpha_s*Bx*0.5/a2; ,
1033 Lc[
k][
BXt] = (one_gmm*alpha_s*By - sqrt(rho)*a*alpha_f*beta_y)*0.5/a2; ,
1034 Lc[
k][
BXb] = (one_gmm*alpha_s*Bz - sqrt(rho)*a*alpha_f*beta_z)*0.5/a2; )
1036 Lc[k][ENG] = alpha_s*(
g_gamma - 1.0)*0.5/a2;
1047 lambda[
k] = vx -
ca;
1049 Rc[
MXt][
k] = - beta_z*S;
1050 Rc[
MXb][
k] = + beta_y*S;
1051 Rc[
BXt][
k] = - beta_z*one_sqrho;
1052 Rc[
BXb][
k] = beta_y*one_sqrho;
1057 Lc[
k][
RHO] = 0.5*Ga;
1058 Lc[
k][
MXt] = - 0.5*beta_z*S;
1059 Lc[
k][
MXb] = 0.5*beta_y*S;
1060 Lc[
k][
BXt] = - 0.5*sqrt(rho)*beta_z;
1061 Lc[
k][
BXb] = 0.5*sqrt(rho)*beta_y;
1068 lambda[
k] = vx +
ca;
1072 Rc[
BXt][
k] = - Rc[
BXt][KALFVM];
1073 Rc[
BXb][
k] = - Rc[
BXb][KALFVM];
1075 Rc[ENG][
k] = Rc[ENG][KALFVM];
1081 Lc[
k][
BXt] = - Lc[KALFVM][
BXt];
1082 Lc[
k][
BXb] = - Lc[KALFVM][
BXb];
1084 Lc[
k][ENG] = Lc[KALFVM][ENG];
1129 #if CHECK_EIGENVECTORS == YES
1131 static double **A, **ALR;
1132 double dA,
vel2, Bmag2, vB;
1138 print (
"! ConsEigenvectors: eigenvector check requires 3 components\n");
1149 for (i = 0; i <
NFLX; i++){
1150 for (j = 0; j <
NFLX; j++){
1151 A[
i][
j] = ALR[
i][
j] = 0.0;
1193 - (u[ENG] + v[PRS] + 0.5*Bmag2)/v[RHO]*v[
VXn] + vB*v[
BXn]/v[RHO];
1196 + (u[ENG] + v[PRS] + 0.5*Bmag2)/v[
RHO] - v[
BXn]*v[
BXn]/v[
RHO];
1208 #elif EOS == ISOTHERMAL
1246 for (i = 0; i <
NFLX; i++){
1247 for (j = 0; j <
NFLX; j++){
1249 for (k = 0; k <
NFLX; k++){
1250 ALR[
i][
j] += Rc[
i][
k]*lambda[
k]*Lc[
k][
j];
1254 for (i = 0; i <
NFLX; i++){
1255 for (j = 0; j <
NFLX; j++){
1256 if (j ==
BXn)
continue;
1257 if (fabs(ALR[i][j] - A[i][j]) > 1.e-6){
1258 print (
"! ConsEigenvectors: eigenvectors not consistent\n");
1260 print (
"! A[%d][%d] = %16.9e, R.Lambda.L[%d][%d] = %16.9e\n",
1261 i,j, A[i][j], i,j,ALR[i][j]);
1270 for (i = 0; i <
NFLX; i++){
1271 for (j = 0; j <
NFLX; j++){
1272 #if (DIVB_CONTROL == NO) || (DIVB_CONTROL == CONSTRAINED_TRANSPORT)
1273 if (i == KDIVB || j == KDIVB)
continue;
1276 for (k = 0; k <
NFLX; k++) a += Lc[i][k]*Rc[k][j];
1277 if ( (i == j && fabs(a-1.0) > 1.e-8) ||
1278 (i != j && fabs(a)>1.e-8) ) {
1279 print (
"! ConsEigenvectors: Eigenvectors not orthogonal\n");
1280 print (
"! i,j = %d, %d %12.6e \n",i,j,a);
1315 wB = EXPAND(L[PRS]*v[PRS], + L[BXt]*v[BXt], + L[BXb]*v[BXb]);
1316 #elif EOS == ISOTHERMAL
1317 wB = EXPAND(L[RHO]*v[RHO], + L[BXt]*v[BXt], + L[BXb]*v[BXb]);
1331 #if DIVB_CONTROL == EIGHT_WAVES
1340 wv = EXPAND(L[VXn]*v[VXn], + L[VXt]*v[VXt], + L[VXb]*v[VXb]);
1343 wB = EXPAND(L[PRS]*v[PRS], + L[BXt]*v[BXt], + L[BXb]*v[BXb]);
1344 #elif EOS == ISOTHERMAL
1345 wB = EXPAND(L[RHO]*v[RHO], + L[BXt]*v[BXt], + L[BXb]*v[BXb]);
1348 w[KSLOWM] = wv + wB;
1349 w[KSLOWP] = -wv + wB;
1355 w[KALFVM] = wv + wB;
1356 w[KALFVP] = wv - wB;
1381 #if CHECK_EIGENVECTORS == YES
1386 for (k = 0; k <
NVAR; k++){
1388 for (i = 0; i <
NVAR; i++) w2[k] += Lp[k][i]*v[i];
1389 if (fabs(w[k] - w2[k]) > 1.e-8){
1390 printf (
"! PrimToChar: projection not correct, k = %d\n",k);
void Eigenvalues(double **v, double *csound2, double **lambda, int beg, int end)
void print1(const char *fmt,...)
void PrimEigenvectors(double *q, double cs2, double h, double *lambda, double **LL, double **RR)
void ShowMatrix(double **, int n, double)
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 ConsEigenvectors(double *u, double *v, double a2, double **LL, double **RR, double *lambda)
void BACKGROUND_FIELD(real x1, real x2, real x3, real *B0)
void MaxSignalSpeed(double **v, double *cs2, double *cmin, double *cmax, int beg, int end)
#define ARRAY_2D(nx, ny, type)
double glm_ch
The propagation speed of divergence error.
#define QUIT_PLUTO(e_code)