11 int direction_2 = direction_1 == 0 ? 1 : 0;
12 int direction_3 = direction_1 == 2 ? 1 : 2;
15 double u = Q[s.v + 0];
16 double v = Q[s.v + 1];
17 double w = Q[s.v + 2];
20 double sigma_xx = Q[s.sigma + 0];
21 double sigma_yy = Q[s.sigma + 1];
22 double sigma_zz = Q[s.sigma + 2];
24 double sigma_xy = Q[s.sigma + 3 + 0];
25 double sigma_xz = Q[s.sigma + 3 + 1];
26 double sigma_yz = Q[s.sigma + 3 + 2];
28 Q[s.v + direction_1] = u;
29 Q[s.v + direction_2] = v;
30 Q[s.v + direction_3] = w;
31 Q[s.sigma + direction_1] = sigma_xx;
32 Q[s.sigma + direction_2] = sigma_yy;
33 Q[s.sigma + direction_3] = sigma_zz;
34 Q[s.sigma + 2 + direction_1 + direction_2] = sigma_xy;
35 Q[s.sigma + 2 + direction_1 + direction_3] = sigma_xz;
36 Q[s.sigma + 2 + direction_2 + direction_3] = sigma_yz;
43 int direction_2 = direction_1 == 0 ? 1 : 0;
44 int direction_3 = direction_1 == 2 ? 1 : 2;
47 double u = Q[s.v + direction_1];
48 double v = Q[s.v + direction_2];
49 double w = Q[s.v + direction_3];
52 double sigma_xx = Q[s.sigma + direction_1];
53 double sigma_yy = Q[s.sigma + direction_2];
54 double sigma_zz = Q[s.sigma + direction_3];
56 double sigma_xy = Q[s.sigma + 2 + direction_1 + direction_2];
57 double sigma_xz = Q[s.sigma + 2 + direction_1 + direction_3];
58 double sigma_yz = Q[s.sigma + 2 + direction_2 + direction_3];
63 Q[s.sigma + 0] = sigma_xx;
64 Q[s.sigma + 1] = sigma_yy;
65 Q[s.sigma + 2] = sigma_zz;
66 Q[s.sigma + 3 + 0] = sigma_xy;
67 Q[s.sigma + 3 + 1] = sigma_xz;
68 Q[s.sigma + 3 + 2] = sigma_yz;
74 std::fill_n(eigenvectors, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
76 kernels::idx2 idx2(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables, s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables);
77 double rho = Q[s.rho];
80 double i_alpha = Q[s.alpha] <= 0 ? 0 : 1.0 / Q[s.alpha];
82 eigenvectors[idx2(0, s.sigma + 0)] = rho * (cp * cp);
83 eigenvectors[idx2(0, s.sigma + 1)] = rho * ((cp * cp) - 2 * (cs * cs));
84 eigenvectors[idx2(0, s.sigma + 2)] = rho * ((cp * cp) - 2 * (cs * cs));
85 eigenvectors[idx2(0, s.v + 0)] = cp;
87 eigenvectors[idx2(1, s.sigma + 3)] = rho * (cs * cs);
88 eigenvectors[idx2(1, s.v + 1)] = cs;
90 eigenvectors[idx2(2, s.sigma + 4)] = rho * (cs * cs);
91 eigenvectors[idx2(2, s.v + 2)] = cs;
93 eigenvectors[idx2(3, s.sigma + 1)] = 1;
95 eigenvectors[idx2(4, s.sigma + 2)] = 1;
97 eigenvectors[idx2(5, s.sigma + 5)] = 1;
99 eigenvectors[idx2(6, s.cs)] = 1;
101 eigenvectors[idx2(7, s.cp)] = 1;
103 eigenvectors[idx2(8, s.rho)] = 1;
105 eigenvectors[idx2(9, s.sigma + 0)] = -2.0 * Q[s.sigma + 0];
106 eigenvectors[idx2(9, s.sigma + 3)] = -2.0 * Q[s.sigma + 3];
107 eigenvectors[idx2(9, s.sigma + 4)] = -2.0 * Q[s.sigma + 4];
108 eigenvectors[idx2(9, s.v + 0)] = Q[s.v + 0] * i_alpha;
109 eigenvectors[idx2(9, s.v + 1)] = Q[s.v + 1] * i_alpha;
110 eigenvectors[idx2(9, s.v + 2)] = Q[s.v + 2] * i_alpha;
111 eigenvectors[idx2(9, s.alpha)] = 1;
113 eigenvectors[idx2(10, s.sigma + 4)] = rho * (cs * cs);
114 eigenvectors[idx2(10, s.v + 2)] = -cs;
116 eigenvectors[idx2(11, s.sigma + 3)] = rho * (cs * cs);
117 eigenvectors[idx2(11, s.v + 1)] = -cs;
119 eigenvectors[idx2(12, s.sigma + 0)] = rho * (cp * cp);
120 eigenvectors[idx2(12, s.sigma + 1)] = rho * ((cp * cp) - 2 * (cs * cs));
121 eigenvectors[idx2(12, s.sigma + 2)] = rho * ((cp * cp) - 2 * (cs * cs));
122 eigenvectors[idx2(12, s.v + 0)] = -cp;
125 for (
int i = 0; i < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; i++) {
126 for (
int j = 0; j < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; j++) {
127 if (!std::isfinite(eigenvectors[idx2(i, j)])) {
128 for (
int k = 0; k < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; k++) {
129 std::cout << Q[k] << std::endl;
132 assertion2(std::isfinite(eigenvectors[idx2(i, j)]), i, j);
141 std::fill_n(eigenvectors, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
142 kernels::idx2 idx2(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables, s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables);
144 double rho = Q[s.rho];
147 double i_alpha = Q[s.alpha] <= 0 ? 0 : 1.0 / Q[s.alpha];
149 eigenvectors[idx2(0, s.sigma + 0)] = 1.0 / (rho * (cp * cp) * 2.0);
150 eigenvectors[idx2(0, s.v + 0)] = 1.0 / (cp * 2.0);
151 eigenvectors[idx2(0, s.alpha)] = -(cp * rho * Q[s.v + 0] * i_alpha - 2 * Q[s.sigma + 0]) / (rho * (cp * cp) * 2.0);
153 eigenvectors[idx2(1, s.sigma + 3)] = 1.0 / (rho * (cs * cs) * 2.0);
154 eigenvectors[idx2(1, s.v + 1)] = 1.0 / (cs * 2.0);
155 eigenvectors[idx2(1, s.alpha)] = -(cs * rho * Q[s.v + 1] * i_alpha - 2 * Q[s.sigma + 3]) / (rho * (cs * cs) * 2.0);
157 eigenvectors[idx2(2, s.sigma + 4)] = 1.0 / (2.0 * rho * (cs * cs));
158 eigenvectors[idx2(2, s.v + 2)] = 1.0 / (cs * 2.0);
159 eigenvectors[idx2(2, s.alpha)] = -(cs * rho * Q[s.v + 2] * i_alpha - 2 * Q[s.sigma + 4]) / (rho * (cs * cs) * 2.0);
161 eigenvectors[idx2(3, s.sigma + 0)] = (-(cp * cp) + 2 * (cs * cs)) / (cp * cp);
162 eigenvectors[idx2(3, s.sigma + 1)] = 1.0;
163 eigenvectors[idx2(3, s.alpha)] = 2 * Q[s.sigma + 0] * ((-cp * cp) + 2 * (cs * cs)) / (cp * cp);
165 eigenvectors[idx2(4, s.sigma + 0)] = (-(cp * cp) + 2 * (cs * cs)) / (cp * cp);
166 eigenvectors[idx2(4, s.sigma + 2)] = 1.0;
167 eigenvectors[idx2(4, s.alpha)] = 2 * Q[s.sigma + 0] * ((-cp * cp) + 2 * (cs * cs)) / (cp * cp);
169 eigenvectors[idx2(5, s.sigma + 5)] = 1.0;
171 eigenvectors[idx2(6, s.cs)] = 1.0;
173 eigenvectors[idx2(7, s.cp)] = 1.0;
175 eigenvectors[idx2(8, s.rho)] = 1.0;
177 eigenvectors[idx2(9, s.alpha)] = 1.0;
179 eigenvectors[idx2(10, s.sigma + 4)] = 1.0 / ((cs * cs) * rho * 2.0);
180 eigenvectors[idx2(10, s.v + 2)] = -1.0 / (cs * 2.0);
181 eigenvectors[idx2(10, s.alpha)] = (cs * rho * Q[s.v + 2] * i_alpha + 2 * Q[s.sigma + 4]) / (rho * (cs * cs) * 2.0);
183 eigenvectors[idx2(11, s.sigma + 3)] = 1.0 / ((cs * cs) * rho * 2.0);
184 eigenvectors[idx2(11, s.v + 1)] = -1.0 / (cs * 2.0);
185 eigenvectors[idx2(11, s.alpha)] = (cs * rho * Q[s.v + 1] * i_alpha + 2 * Q[s.sigma + 3]) / (rho * (cs * cs) * 2.0);
187 eigenvectors[idx2(12, s.sigma + 0)] = 1.0 / ((cp * cp) * rho * 2.0);
188 eigenvectors[idx2(12, s.v + 0)] = -1.0 / (cp * 2.0);
189 eigenvectors[idx2(12, s.alpha)] = (cp * rho * Q[s.v + 0] * i_alpha + 2 * Q[s.sigma + 0]) / (rho * (cp * cp) * 2.0);
192 for (
int i = 0; i < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; i++) {
193 for (
int j = 0; j < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; j++) {
194 if (!std::isfinite(eigenvectors[idx2(i, j)])) {
195 for (
int k = 0; k < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; k++) {
196 std::cout << Q[k] << std::endl;
199 assertion2(std::isfinite(eigenvectors[idx2(i, j)]), i, j);
226 double computeSmax(
const double*
const Q_L,
const double*
const Q_R) {
230 double Ev_R[(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables)];
231 double Ev_L[(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables)];
232 std::fill_n(Ev_R, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
233 std::fill_n(Ev_L, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
235 eigenvalues<Shortcuts>(Q_R, Ev_R);
236 eigenvalues<Shortcuts>(Q_L, Ev_L);
238 double ev_max = std::numeric_limits<double>::min();
240 for (
int i = 0; i < s.NumberOfUnknowns; i++) {
241 ev_max = std::max(std::abs(Ev_R[i]), ev_max);
242 ev_max = std::max(std::abs(Ev_L[i]), ev_max);
251 void computeAbsA(
const double*
const Q_L,
const double*
const Q_R,
double absA[],
int direction) {
254 kernels::idx2 idxA(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables, s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables);
255 std::fill_n(absA, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
258 double R[(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables)];
259 std::fill_n(R, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
260 double R_inv[(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables)];
261 std::fill_n(R_inv, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
264 double Qavg[s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables];
265 std::fill_n(Qavg, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
268 double Ev[(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables)];
269 std::fill_n(Ev, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
271 double ev_max = computeSmax<Shortcuts>(Q_L, Q_R);
274 for (
int k = 0; k < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; k++) {
275 Qavg[k] = (Q_L[k] + Q_R[k]) * 0.5;
278 rotate_dofs<Shortcuts>(Qavg, direction);
284 right_eigenvectors<Shortcuts>(Qavg, direction, R);
285 right_eigenvectors_inverse<Shortcuts>(Qavg, direction, R_inv);
288 for (
int i = 0; i < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; i++) {
289 rotate_dofs_inverse<Shortcuts>(R + idxA(i, 0), direction);
293 for (
int i = 0; i < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; i++) {
294 rotate_dofs_inverse<Shortcuts>(R_inv + idxA(i, 0), direction);
297 eigenvalues<Shortcuts>(Qavg, Ev);
300 for (
int i = 0; i < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; i++) {
301 Ev[i] = 1.0 - std::abs(Ev[i]) / ev_max;
305 for (
int i = 0; i < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; i++) {
306 absA[idxA(i, i)] = -0.5 * ev_max;
317 for (
int i = 0; i < s.NumberOfAuxiliaryVariables + s.NumberOfUnknowns; i++) {
318 for (
int j = 0; j < s.NumberOfAuxiliaryVariables + s.NumberOfUnknowns; j++) {
319 R[idxA(j, i)] = R[idxA(j, i)] * Ev[j];
323 for (
int i = 0; i < s.NumberOfAuxiliaryVariables + s.NumberOfUnknowns; i++) {
324 for (
int j = 0; j < s.NumberOfAuxiliaryVariables + s.NumberOfUnknowns; j++) {
326 for (
int k = 6; k < 10; k++) {
327 absA[idxA(i, j)] += 0.5 * ev_max * R[idxA(k, i)] * R_inv[idxA(k, j)];
343 Solver* solver,
double* FL_,
double* FR_,
const double*
const QL_,
const double*
const QR_,
const int direction
348 double gradQ[(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (Dimensions)];
349 std::fill_n(gradQ, ((s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * Dimensions), 0.0);
352 double ncp[s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables];
353 std::fill_n(ncp, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
356 double Qavg[s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables];
357 std::fill_n(Qavg, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
359 kernels::idx2 idx2(Dimensions, s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables);
360 kernels::idx2 idxA(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables, s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables);
363 double absA[(s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables)];
364 std::fill_n(absA, (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables) * (s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables), 0.0);
366 computeAbsA<Shortcuts>(QL_, QR_, absA, direction);
369 for (
int k = 0; k < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; k++) {
370 gradQ[idx2(direction, k)] = (QR_[k] - QL_[k]);
374 for (
int k = 0; k < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; k++) {
375 Qavg[k] = (QL_[k] + QR_[k]) * 0.5;
380 solver->nonConservativeProduct(Qavg, gradQ, ncp);
400 for (
int k = 0; k < s.NumberOfUnknowns; k++) {
401 for (
int l = 0; l < s.NumberOfUnknowns + s.NumberOfAuxiliaryVariables; l++) {
402 FR_[k] += absA[idxA(k, l)] * gradQ[idx2(direction, l)];
412 std::copy_n(FR_, s.NumberOfUnknowns, FL_);
414 for (
int k = 0; k < s.NumberOfUnknowns; k++) {
415 FR_[k] -= 0.5 * ncp[k];
416 FL_[k] += 0.5 * ncp[k];
bool equals(const Matrix< Rows, Cols, Scalar > &lhs, const Matrix< Rows, Cols, Scalar > &rhs, const Scalar &tolerance=NUMERICAL_ZERO_DIFFERENCE)
Compares to matrices on equality by means of a numerical accuracy.