 |
Peano
|
Loading...
Searching...
No Matches
Go to the documentation of this file.
5 // The eigenvalue represents the maximal velocity as a fraction of
6 // the speed of light, as such it can never be greater than 1, and
7 // returning 1 is safe as it an upper bound for the real eigenvalue
11 constexpr double gamma = 4.0/3.0;
13 // Eigenvalues as given by Olindo
14 double V[NumberOfUnknowns];
15 //TODO: get whether this produced an error? make that an assertion?
16 GRMHD::PDE::PDECons2Prim(Q, V);
18 double rho = V[Shortcuts::rho];
20 V[Shortcuts::vel + 0], V[Shortcuts::vel + 1], V[Shortcuts::vel + 2]
22 double p = V[Shortcuts::E];
24 V[Shortcuts::B + 0], V[Shortcuts::B + 1], V[Shortcuts::B + 2]
28 V[Shortcuts::shift + 0], V[Shortcuts::shift + 1], V[Shortcuts::shift + 2]
30 // double psi = V[Shortcuts::psi]; // unused variable
31 double lapse = V[Shortcuts::lapse];
33 double g_cov[3][3] = {
34 {V[Shortcuts::gij + 0], V[Shortcuts::gij + 1], V[Shortcuts::gij + 2]},
35 {V[Shortcuts::gij + 1], V[Shortcuts::gij + 3], V[Shortcuts::gij + 4]},
36 {V[Shortcuts::gij + 2], V[Shortcuts::gij + 4], V[Shortcuts::gij + 5]}
40 double gp = GRMHD::PDE::matrixInverse3x3(g_cov, g_contr);
45 GRMHD::PDE::matrixVectMult(g_contr, v_cov, v_contr);
48 GRMHD::PDE::matrixVectMult(g_cov, B_contr, B_cov);
50 // evaluate useful quantities
51 double v2 = v_contr[0]*v_cov[0] + v_contr[1]*v_cov[1] + v_contr[2]*v_cov[2];
52 // double lf = 1.0/sqrt(1.0 - v2);
53 double lf2m = 1.0 - v2;
54 double b2 = B_contr[0]*B_cov[0] + B_contr[1]*B_cov[1] + B_contr[2]*B_cov[2];
56 double VdotB = v_contr[0]*B_cov[0] + v_contr[1]*B_cov[1] + v_contr[2]*B_cov[2];
57 double b2_4 = b2*lf2m + VdotB;
58 double gamma1 = gamma/(gamma-1.0);
59 double w = rho + gamma1*p + b2_4;
60 double cs2 = (gamma*p + b2_4)/w;
62 double u = v_contr[normal];
63 double sft = shift[normal];
64 double gg = g_contr[normal][normal];
65 double den = 1.0/(1.0 - v2*cs2);
67 double deltaU = sqrt( cs2*lf2m*( (1.0-v2*cs2)*gg - u*u*(1.0-cs2) ));
69 double maxEigenvalue = std::abs(lapse*u -sft);
71 maxEigenvalue = std::max( maxEigenvalue,
73 lapse*den*( u*(1.0-cs2) - deltaU ) - sft
76 maxEigenvalue = std::max( maxEigenvalue,
78 lapse*den*( u*(1.0-cs2) + deltaU ) - sft
81 maxEigenvalue = std::max( maxEigenvalue,
87 //Safe mode: return also 'covariant' eigenvalues, should never be required
88 // double shift_cov[3];
89 // GRMHD::PDE::matrixVectMult(g_cov, shift, shift_cov);
90 // double vn2 = v_cov[normal];
91 // double sft2 = shift_cov[normal];
92 // double gg2 = g_cov[normal][normal];
93 // den = 1.0/(1.0 - v2*cs2);
96 // deltaU = sqrt( cs2*lf2m*( (1.0-v2*cs2)*gg2 - u*u*(1.0-cs2) ));
98 // maxEigenvalue = std::max( maxEigenvalue,
100 // lapse*den*( u*(1.0-cs2) - deltaU ) - sft2
103 // maxEigenvalue = std::max( maxEigenvalue,
105 // lapse*den*( u*(1.0-cs2) - deltaU ) - sft2
108 // maxEigenvalue = std::max( maxEigenvalue,
110 // lapse*den*( u*(1.0-cs2) - deltaU ) - sft2
115 std::fill_n(F, NumberOfUnknowns, 0.0);
117 constexpr double gamma = 4.0/3.0;
118 double gamma1 = gamma/(gamma-1.0);
120 double V[NumberOfUnknowns];
121 //TODO: get whether this produced an error? make that an assertion?
122 GRMHD::PDE::PDECons2Prim(Q, V);
125 // pdecons2prim_(V,Q,&iErr);
127 double rho = V[Shortcuts::rho];
129 V[Shortcuts::vel + 0], V[Shortcuts::vel + 1], V[Shortcuts::vel + 2]
131 double p = V[Shortcuts::E];
132 double B_contr[3] = {
133 V[Shortcuts::B + 0], V[Shortcuts::B + 1], V[Shortcuts::B + 2]
135 double QB_contr[3] = {
136 Q[Shortcuts::B + 0], Q[Shortcuts::B + 1], Q[Shortcuts::B + 2]
139 V[Shortcuts::shift + 0], V[Shortcuts::shift + 1], V[Shortcuts::shift + 2]
141 // double psi = V[Shortcuts::psi]; // unused variable
142 double lapse = V[Shortcuts::lapse];
144 double g_cov[3][3] = {
145 {V[Shortcuts::gij + 0], V[Shortcuts::gij + 1], V[Shortcuts::gij + 2]},
146 {V[Shortcuts::gij + 1], V[Shortcuts::gij + 3], V[Shortcuts::gij + 4]},
147 {V[Shortcuts::gij + 2], V[Shortcuts::gij + 4], V[Shortcuts::gij + 5]}
150 double g_contr[3][3];
151 double gp = GRMHD::PDE::matrixInverse3x3(g_cov, g_contr);
156 GRMHD::PDE::matrixVectMult(g_contr, v_cov, v_contr);
159 GRMHD::PDE::matrixVectMult(g_contr, &Q[1], S_contr);
162 GRMHD::PDE::matrixVectMult(g_cov, QB_contr, BQ);
165 GRMHD::PDE::matrixVectMult(g_cov, B_contr, B_cov);
168 double vxB_cov[3] = {
169 gp*(v_contr[1]*B_contr[2] - v_contr[2]*B_contr[1]),
170 gp*(v_contr[2]*B_contr[0] - v_contr[0]*B_contr[2]),
171 gp*(v_contr[0]*B_contr[1] - v_contr[1]*B_contr[0])
175 double vxB_contr[3] = {
176 gm*(v_cov[1]*B_cov[2] - v_cov[2]*B_cov[1]),
177 gm*(v_cov[2]*B_cov[0] - v_cov[0]*B_cov[2]),
178 gm*(v_cov[0]*B_cov[1] - v_cov[1]*B_cov[0])
181 double v2 = v_contr[0]*v_cov[0] + v_contr[1]*v_cov[1] + v_contr[2]*v_cov[2];
182 double e2 = vxB_contr[0]*vxB_cov[0] + vxB_contr[1]*vxB_cov[1] + vxB_contr[2]*vxB_cov[2];
183 double b2 = B_contr[0]*B_cov[0] + B_contr[1]*B_cov[1] + B_contr[2]*B_cov[2];
185 double uem = 0.5*(b2 + e2);
186 double lf = 1.0/sqrt(1.0 - v2);
188 double w = rho + gamma1*p;
190 double wwx = ww*v_contr[0];
191 double wwy = ww*v_contr[1];
192 double wwz = ww*v_contr[2];
195 lapse*v_contr[0]-shift[0], lapse*v_contr[1]-shift[1], lapse*v_contr[2]-shift[2]
199 for(int i=0; i<3; i++){
200 for(int j=0; j<3; j++){
201 Fij[i][j] = Vtr[i]*QB_contr[j]-Vtr[j]*QB_contr[i];
207 F[0] = v_contr[0]*Q[0];
208 F[1] = gp*(wwx*v_cov[0] - vxB_contr[0]*vxB_cov[0] - B_contr[0]*B_cov[0] + p + uem);
209 F[2] = gp*(wwx*v_cov[1] - vxB_contr[0]*vxB_cov[1] - B_contr[0]*B_cov[1]);
210 F[3] = gp*(wwx*v_cov[2] - vxB_contr[0]*vxB_cov[2] - B_contr[0]*B_cov[2]);
211 F[4] = S_contr[0]-F[0];
217 F[0] = v_contr[1]*Q[0];
218 F[1] = gp*(wwy*v_cov[0] - vxB_contr[1]*vxB_cov[0] - B_contr[1]*B_cov[0]);
219 F[2] = gp*(wwy*v_cov[1] - vxB_contr[1]*vxB_cov[1] - B_contr[1]*B_cov[1] + p + uem);
220 F[3] = gp*(wwy*v_cov[2] - vxB_contr[1]*vxB_cov[2] - B_contr[1]*B_cov[2]);
221 F[4] = S_contr[1]-F[0];
227 F[0] = v_contr[2]*Q[0];
228 F[1] = gp*(wwz*v_cov[0] - vxB_contr[2]*vxB_cov[0] - B_contr[2]*B_cov[0]);
229 F[2] = gp*(wwz*v_cov[1] - vxB_contr[2]*vxB_cov[1] - B_contr[2]*B_cov[1]);
230 F[3] = gp*(wwz*v_cov[2] - vxB_contr[2]*vxB_cov[2] - B_contr[2]*B_cov[2] + p + uem);
231 F[4] = S_contr[2]-F[0];
238 // Remember that Q(:) below contains already the factor gp, which is ok!
239 for(int i=0; i<5; i++){
240 F[i] = lapse*F[i] - shift[normal]*Q[i];
245 std::fill_n(BTimesDeltaQ, NumberOfUnknowns, 0.0);
248 constexpr double gamma = 4.0/3.0;
249 constexpr double DivCleaning_a = 1.0;
253 Q[Shortcuts::shift+0], Q[Shortcuts::shift+1], Q[Shortcuts::shift+2]
256 double g_cov[3][3] = {
257 {Q[13], Q[14], Q[15]},
258 {Q[14], Q[16], Q[17]},
259 {Q[15], Q[17], Q[18]}
262 double g_contr[3][3];
263 double gp = GRMHD::PDE::matrixInverse3x3(g_cov, g_contr);
268 double Vc[NumberOfUnknowns];
269 //TODO: get whether this produced an error? make that an assertion?
270 GRMHD::PDE::PDECons2Prim(Q, Vc);
272 double gamma1 = gamma/(gamma-1.);
280 double B_contr[3] = {
281 Vc[Shortcuts::B + 0], Vc[Shortcuts::B + 1], Vc[Shortcuts::B + 2]
283 // double QB_contr[3] = {
284 // Q[Shortcuts::B + 0], Q[Shortcuts::B + 1], Q[Shortcuts::B + 2]
285 // }; //unused variable
288 GRMHD::PDE::matrixVectMult(g_cov, B_contr, B_cov);
290 // double psi = Vc[Shortcuts::psi];
293 GRMHD::PDE::matrixVectMult(g_contr, v_cov, v_contr);
296 GRMHD::PDE::matrixVectMult(g_contr, &Q[Shortcuts::vel], S_contr);
299 double vxB_cov[3] = {
300 gp*(v_contr[1]*B_contr[2] - v_contr[2]*B_contr[1]),
301 gp*(v_contr[2]*B_contr[0] - v_contr[0]*B_contr[2]),
302 gp*(v_contr[0]*B_contr[1] - v_contr[1]*B_contr[0])
306 double vxB_contr[3] = {
307 gm*(v_cov[1]*B_cov[2] - v_cov[2]*B_cov[1]),
308 gm*(v_cov[2]*B_cov[0] - v_cov[0]*B_cov[2]),
309 gm*(v_cov[0]*B_cov[1] - v_cov[1]*B_cov[0])
312 double v2 = v_contr[0]*v_cov[0] + v_contr[1]*v_cov[1] + v_contr[2]*v_cov[2];
313 double e2 = vxB_contr[0]*vxB_cov[0] + vxB_contr[1]*vxB_cov[1] + vxB_contr[2]*vxB_cov[2];
314 double b2 = B_contr[0]*B_cov[0] + B_contr[1]*B_cov[1] + B_contr[2]*B_cov[2];
316 double uem = 0.5*(b2 + e2);
317 double lf = 1.0/sqrt(1.0 - v2);
319 double w = rho + gamma1*p;
322 double delta[3][3] = {
323 {1., 0., 0.}, {0., 1., 0.}, {0., 0., 1.}
326 //Consider unrolling these loops
328 for(int i=0; i<3; i++){
329 double W_ij = ww*v_cov[i]*v_contr[normal]-vxB_cov[i]*vxB_contr[normal]-B_cov[i]*B_contr[normal]+(p+uem)*delta[i][normal];
330 BTimesDeltaQ[Shortcuts::vel + normal] -= Q[Shortcuts::vel+i]*deltaQ[Shortcuts::shift+i];
331 BTimesDeltaQ[Shortcuts::E] -= gp*W_ij*deltaQ[Shortcuts::shift+i];
333 for(int j=0; j<3; j++){
335 double Wim = ww*v_contr[i]*v_contr[j]-vxB_contr[i]*vxB_contr[j]-B_contr[i]*B_contr[j]+(p+uem)*g_contr[i][j];
339 BTimesDeltaQ[Shortcuts::vel+normal] -= 0.5*gp*lapse*Wim*deltaQ[Shortcuts::gij+ccount];
340 BTimesDeltaQ[Shortcuts::E] -= 0.5*gp*Wim*shift[normal]*deltaQ[Shortcuts::gij+ccount];
346 BTimesDeltaQ[Shortcuts::vel+normal] += (Q[Shortcuts::E]+Q[Shortcuts::rho])*deltaQ[Shortcuts::lapse];
347 BTimesDeltaQ[Shortcuts::E] += S_contr[normal]*deltaQ[Shortcuts::lapse];
348 BTimesDeltaQ[Shortcuts::B+0] = lapse*gp*g_contr[0][normal]*deltaQ[Shortcuts::psi]
349 - Q[Shortcuts::shift+0]*deltaQ[Shortcuts::B+normal];
350 BTimesDeltaQ[Shortcuts::B+1] = lapse*gp*g_contr[1][normal]*deltaQ[Shortcuts::psi]
351 - Q[Shortcuts::shift+1]*deltaQ[Shortcuts::B+normal];
352 BTimesDeltaQ[Shortcuts::B+2] = lapse*gp*g_contr[2][normal]*deltaQ[Shortcuts::psi]
353 - Q[Shortcuts::shift+2]*deltaQ[Shortcuts::B+normal];
354 BTimesDeltaQ[Shortcuts::psi] = gm*lapse*DivCleaning_a*DivCleaning_a*deltaQ[Shortcuts::B+normal]
355 - Q[Shortcuts::shift+normal]*deltaQ[Shortcuts::psi];