PLUTO
energy_solve.c File Reference

Inversion scheme for RMHD using total energy density. More...

#include "pluto.h"
Include dependency graph for energy_solve.c:

Go to the source code of this file.

Macros

#define MAX_ITER   50
 

Functions

int EnergySolve (Map_param *par)
 

Detailed Description

Inversion scheme for RMHD using total energy density.

Try to recover gas pressure from conserved variables {D, m, E, B} using the algorithm outlined in Section A3 of Mignone & McKinney (2007). Specifically, we solve Eq. (A4) or (A6) (depending on the value of RMHD_REDUCED_ENERGY) using a Newton-Raphson scheme. Here W = rho*h*lorentz^2, E, D, etc... have the same meaning as in the mentioned paper.

Author
A. Mignone (migno.nosp@m.ne@p.nosp@m.h.uni.nosp@m.to.i.nosp@m.t)
Date
June 25, 2015

References

  • "Equation of state in relativistic magnetohydrodynamics: variable versus constant adiabatic index"
    Mignone & Mc Kinney, MNRAS (2007) 378, 1118.

Definition in file energy_solve.c.

Macro Definition Documentation

#define MAX_ITER   50

Definition at line 26 of file energy_solve.c.

Function Documentation

int EnergySolve ( Map_param par)

Solve f(W) = 0, where f(W) is Equation (A4) or (A6).

Returns
Return (0) is successful, (1) otherwise.

Definition at line 28 of file energy_solve.c.

35 {
36  int k;
37  int done;
38  double Y1, Y2, scrh, th;
39  double W, W2, S2_W2, fW, dfW, dW;
40  double dv2_dW, chi, chi_p_rho;
41  double rho, p, lor, lor2;
42  double dp, dp_drho, dp_dchi;
43  double dchi_dW, drho_dW;
44  double acc = 1.e-11;
45  double one_m_v2, vel2, Wp;
46  double m2, B2, S, S2;
47  double D, E;
48 
49 /* -- copy structure members to local variables -- */
50 
51  D = par->D;
52  E = par->E;
53  S = par->S;
54  m2 = par->m2;
55  B2 = par->B2;
56  S2 = par->S2;
57 
58 /* -------------------------------------------
59  Provide initial guess by taking the
60  positive root of Eq. (A27).
61  ------------------------------------------- */
62 
63  #if RMHD_REDUCED_ENERGY == YES
64  Y1 = -4.0*(E + D - B2);
65  Y2 = m2 - 2.0*(E + D)*B2 + B2*B2;
66  #else
67  Y1 = -4.0*(E - B2);
68  Y2 = m2 - 2.0*E*B2 + B2*B2;
69  #endif
70  chi = Y1*Y1 - 12.0*Y2;
71  chi = MAX(0.0,chi);
72  W = ( - Y1 + sqrt(chi))/6.0;
73  W = MAX(D, W);
74 
75  #if RMHD_REDUCED_ENERGY == YES
76  Wp = W - D;
77  #endif
78 
79  done = 0; p = -1.0;
80  for (k = 1; k < MAX_ITER; k++) {
81 
82  #if RMHD_REDUCED_ENERGY == YES
83  W = Wp + D;
84  #endif
85 
86  W2 = W*W;
87  S2_W2 = S2/W2;
88  Y1 = 1.0/(W + B2);
89  Y2 = Y1*Y1;
90 
91  vel2 = S2_W2*Y1*(Y1*W + 1.0) + m2*Y2; /* Eq (A3) */
92  one_m_v2 = 1.0 - vel2;
93  lor2 = 1.0/one_m_v2;
94  lor = sqrt(lor2);
95  if (vel2 > 1.0){
96  WARNING(
97  print ("! EnergySolve: |v| = %f > 1 during iter # %d, ",
98  vel2,k);
99  )
100  return (1);
101  }
102  #if RMHD_REDUCED_ENERGY == YES
103  chi = Wp/lor2 - D*vel2/(lor + 1.0);
104  #else
105  chi = (W - D*lor)*one_m_v2;
106  #endif
107 
108  dv2_dW = -2.0*Y2*(3.0*S2_W2 + Y1*(S2_W2*B2*B2/W + m2)); /* Eq (A16) */
109 
110  /* -- if chi < 0 we let it converge anyway -- */
111 
112  rho = D/lor;
113 
114  /* -- kinematical terms -- */
115 
116  dchi_dW = one_m_v2 - 0.5*lor*(D + 2.0*chi*lor)*dv2_dW;
117  drho_dW = -0.5*D*lor*dv2_dW;
118 
119  #if EOS == IDEAL
120 
121  dp_dchi = (g_gamma - 1.0)/g_gamma; /* Eq. (A 18) */
122  dp_drho = 0.0;
123  p = chi*dp_dchi;
124 
125  #elif EOS == TAUB
126 
127  chi_p_rho = chi + rho;
128  scrh = sqrt(9.0*chi*chi + 18.0*rho*chi + 25.0*rho*rho);
129  p = 2.0*chi*(chi_p_rho + rho)/(5.0*chi_p_rho + scrh); /* Eq (A22) */
130 
131  scrh = 1.0/(5.0*chi_p_rho - 8.0*p);
132  dp_dchi = (2.0*chi_p_rho - 5.0*p)*scrh; /* Eq (A20) */
133  dp_drho = (2.0*chi - 5.0*p)*scrh; /* Eq (A21) */
134 
135  #endif
136 
137  if (done) break;
138 
139  dp = dp_dchi*dchi_dW + dp_drho*drho_dW;
140  #if RMHD_REDUCED_ENERGY == YES
141  fW = Wp + 0.5*(B2 + (B2*m2 - S2)*Y2) - (E + p); /* Eq. (A25) */
142  dfW = 1.0 - dp - (B2*m2 - S2)*Y2*Y1; /* Eq. (A8) */
143  dW = fW/dfW;
144  Wp -= dW;
145  if (fabs(dW) < acc*Wp || fabs(fW) < acc) done = 1;
146  #else
147  fW = W + 0.5*(B2 + (B2*m2 - S2)*Y2) - (E + p); /* Eq. (A25) */
148  dfW = 1.0 - dp - (B2*m2 - S2)*Y2*Y1; /* Eq. (A8) */
149  dW = fW/dfW;
150  W -= dW;
151  if (fabs(dW) < acc*W || fabs(fW) < acc) done = 1;
152  #endif
153 
154  }
155 
156  if (k == MAX_ITER) {
157  WARNING(
158  print ("! EnergySolve(): too many iterations, %12.6e %12.6e %12.6e, ",
159  W, dW, fW);
160  )
161  return(1);
162  }
163  if (p < 0.0) {
164  WARNING(
165  print ("! EnergySolve(): negative pressure, p = %12.6e, ",p);
166  )
167  return(1);
168  }
169 
170 /* -- set output parameters -- */
171 
172  #if RMHD_REDUCED_ENERGY == YES
173  par->W = Wp + D;
174  #else
175  par->W = W;
176  #endif
177 
178  par->rho = rho;
179  par->lor = lor;
180  par->prs = p;
181 
182 /* -- Recompute entropy consistently -- */
183 
184 #if ENTROPY_SWITCH
185  #if EOS == IDEAL
186  par->sigma_c = par->prs*lor/pow(rho,g_gamma-1);
187  #elif EOS == TAUB
188  th = p/rho;
189  par->sigma_c = par->prs*lor/pow(rho,2.0/3.0)*(1.5*th + sqrt(2.25*th*th + 1.0));
190  #endif
191 #endif
192 
193  return(0); /* -- normal exit -- */
194 }
#define MAX(a, b)
Definition: macros.h:101
double g_gamma
Definition: globals.h:112
double m2
Square of total momentum (input).
Definition: mod_defs.h:89
double D
Lab density (input).
Definition: mod_defs.h:86
tuple scrh
Definition: configure.py:200
#define WARNING(a)
Definition: macros.h:217
#define B2
double S2
Square of S (input).
Definition: mod_defs.h:95
#define MAX_ITER
Definition: energy_solve.c:26
double rho
proper density (output)
Definition: mod_defs.h:91
double W
D*h*lor (output).
Definition: mod_defs.h:92
list vel2
Definition: Sph_disk.py:39
double S
mB (input).
Definition: mod_defs.h:94
int k
Definition: analysis.c:2
void print(const char *fmt,...)
Definition: amrPluto.cpp:497
double lor
Lorentz factor (output).
Definition: mod_defs.h:93
double prs
Thermal pressure (output).
Definition: mod_defs.h:94
double sigma_c
Conserved entropy (input).
Definition: mod_defs.h:87
double B2
Square of magnetic field (input).
Definition: mod_defs.h:96
double E
Total energy (input).
Definition: mod_defs.h:88

Here is the call graph for this function: