38 Real
const dx, Real
const gamma,
42 Real
const dtodx = dt / dx;
47 Real
const lambda_m = cell_i.velocity.
x() - sound_speed;
48 Real
const lambda_0 = cell_i.velocity.
x();
49 Real
const lambda_p = cell_i.velocity.
x() + sound_speed;
53 Real qx = -0.5 * fmin(lambda_m, 0.0) * dtodx;
54 interface_R_imh.density = interface_R_imh.density + qx * del_m.density;
55 interface_R_imh.velocity.
x() = interface_R_imh.velocity.
x() + qx * del_m.velocity.
x();
56 interface_R_imh.velocity.y() = interface_R_imh.velocity.y() + qx * del_m.velocity.y();
57 interface_R_imh.velocity.z() = interface_R_imh.velocity.z() + qx * del_m.velocity.z();
58 interface_R_imh.pressure = interface_R_imh.pressure + qx * del_m.pressure;
60 qx = 0.5 * fmax(lambda_p, 0.0) * dtodx;
61 interface_L_iph.density = interface_L_iph.density - qx * del_m.density;
62 interface_L_iph.velocity.
x() = interface_L_iph.velocity.
x() - qx * del_m.velocity.
x();
63 interface_L_iph.velocity.y() = interface_L_iph.velocity.y() - qx * del_m.velocity.y();
64 interface_L_iph.velocity.z() = interface_L_iph.velocity.z() - qx * del_m.velocity.z();
65 interface_L_iph.pressure = interface_L_iph.pressure - qx * del_m.pressure;
68 interface_R_imh.gas_energy = interface_R_imh.gas_energy + qx * del_m.gas_energy;
69 interface_L_iph.gas_energy = interface_L_iph.gas_energy - qx * del_m.gas_energy;
73 for (
int i = 0; i < NSCALARS; i++) {
74 interface_R_imh.scalar[i] = interface_R_imh.scalar[i] + qx * del_m.scalar[i];
75 interface_L_iph.scalar[i] = interface_L_iph.scalar[i] - qx * del_m.scalar[i];
83 Real sum_0 = 0.0, sum_1 = 0.0, sum_2 = 0.0, sum_3 = 0.0, sum_4 = 0.0;
88 Real sum_scalar[NSCALARS];
89 for (
double &scalar_i : sum_scalar) {
94 Real lamdiff = lambda_p - lambda_m;
96 sum_0 += lamdiff * (-cell_i.density * del_m.velocity.
x() / (2 * sound_speed) +
97 del_m.pressure / (2 * sound_speed * sound_speed));
98 sum_1 += lamdiff * (del_m.velocity.
x() / 2.0 - del_m.pressure / (2 * sound_speed * cell_i.density));
99 sum_4 += lamdiff * (-cell_i.density * del_m.velocity.
x() * sound_speed / 2.0 + del_m.pressure / 2.0);
102 Real lamdiff = lambda_p - lambda_0;
104 sum_0 += lamdiff * (del_m.density - del_m.pressure / (sound_speed * sound_speed));
105 sum_2 += lamdiff * del_m.velocity.y();
106 sum_3 += lamdiff * del_m.velocity.z();
108 sum_ge += lamdiff * del_m.gas_energy;
111 for (
int i = 0; i < NSCALARS; i++) {
112 sum_scalar[i] += lamdiff * del_m.scalar[i];
117 Real lamdiff = lambda_p - lambda_p;
119 sum_0 += lamdiff * (cell_i.density * del_m.velocity.
x() / (2 * sound_speed) +
120 del_m.pressure / (2 * sound_speed * sound_speed));
121 sum_1 += lamdiff * (del_m.velocity.
x() / 2.0 + del_m.pressure / (2 * sound_speed * cell_i.density));
122 sum_4 += lamdiff * (cell_i.density * del_m.velocity.
x() * sound_speed / 2.0 + del_m.pressure / 2.0);
126 interface_L_iph.density += 0.5 * dtodx * sum_0;
127 interface_L_iph.velocity.
x() += 0.5 * dtodx * sum_1;
128 interface_L_iph.velocity.y() += 0.5 * dtodx * sum_2;
129 interface_L_iph.velocity.z() += 0.5 * dtodx * sum_3;
130 interface_L_iph.pressure += 0.5 * dtodx * sum_4;
132 interface_L_iph.gas_energy += 0.5 * dtodx * sum_ge;
135 for (
int i = 0; i < NSCALARS; i++) {
136 interface_L_iph.scalar[i] += 0.5 * dtodx * sum_scalar[i];
141 sum_0 = sum_1 = sum_2 = sum_3 = sum_4 = 0;
146 for (
double &scalar_i : sum_scalar) {
151 Real lamdiff = lambda_m - lambda_m;
153 sum_0 += lamdiff * (-cell_i.density * del_m.velocity.
x() / (2 * sound_speed) +
154 del_m.pressure / (2 * sound_speed * sound_speed));
155 sum_1 += lamdiff * (del_m.velocity.
x() / 2.0 - del_m.pressure / (2 * sound_speed * cell_i.density));
156 sum_4 += lamdiff * (-cell_i.density * del_m.velocity.
x() * sound_speed / 2.0 + del_m.pressure / 2.0);
159 Real lamdiff = lambda_m - lambda_0;
161 sum_0 += lamdiff * (del_m.density - del_m.pressure / (sound_speed * sound_speed));
162 sum_2 += lamdiff * del_m.velocity.y();
163 sum_3 += lamdiff * del_m.velocity.z();
165 sum_ge += lamdiff * del_m.gas_energy;
168 for (
int i = 0; i < NSCALARS; i++) {
169 sum_scalar[i] += lamdiff * del_m.scalar[i];
174 Real lamdiff = lambda_m - lambda_p;
176 sum_0 += lamdiff * (cell_i.density * del_m.velocity.
x() / (2 * sound_speed) +
177 del_m.pressure / (2 * sound_speed * sound_speed));
178 sum_1 += lamdiff * (del_m.velocity.
x() / 2.0 + del_m.pressure / (2 * sound_speed * cell_i.density));
179 sum_4 += lamdiff * (cell_i.density * del_m.velocity.
x() * sound_speed / 2.0 + del_m.pressure / 2.0);
183 interface_R_imh.density += 0.5 * dtodx * sum_0;
184 interface_R_imh.velocity.
x() += 0.5 * dtodx * sum_1;
185 interface_R_imh.velocity.y() += 0.5 * dtodx * sum_2;
186 interface_R_imh.velocity.z() += 0.5 * dtodx * sum_3;
187 interface_R_imh.pressure += 0.5 * dtodx * sum_4;
189 interface_R_imh.gas_energy += 0.5 * dtodx * sum_ge;
192 for (
int i = 0; i < NSCALARS; i++) {
193 interface_R_imh.scalar[i] += 0.5 * dtodx * sum_scalar[i];
216auto __device__ __inline__
PLM_Reconstruction(Real *dev_conserved,
int const xid,
int const yid,
int const zid,
217 int const nx,
int const ny,
int const nz, Real
const dx, Real
const dt,
221 int const n_cells = nx * ny * nz;
226 hydro_utilities::Load_Cell_Primitive<direction>(dev_conserved, xid, yid, zid, nx, ny, n_cells, gamma);
230 dev_conserved, xid -
int(direction == 0), yid -
int(direction == 1), zid -
int(direction == 2), nx, ny, n_cells,
235 dev_conserved, xid +
int(direction == 0), yid +
int(direction == 1), zid +
int(direction == 2), nx, ny, n_cells,
282 del_m.gas_energy =
Van_Leer_Limiter(del_L.gas_energy, del_R.gas_energy, del_C.gas_energy, del_G.gas_energy);
285 for (
int i = 0; i < NSCALARS; i++) {
286 del_m.scalar[i] =
Van_Leer_Limiter(del_L.scalar[i], del_R.scalar[i], del_C.scalar[i], del_G.scalar[i]);
303 interface_R_imh.density = fmax(interface_R_imh.density, (Real)TINY_NUMBER);
304 interface_L_iph.density = fmax(interface_L_iph.density, (Real)TINY_NUMBER);
305 interface_R_imh.pressure = fmax(interface_R_imh.pressure, (Real)TINY_NUMBER);
306 interface_L_iph.pressure = fmax(interface_L_iph.pressure, (Real)TINY_NUMBER);
308 struct LocalReturnStruct {
311 return LocalReturnStruct{interface_L_iph, interface_R_imh};