14#include "../global/global.h"
15#include "../global/global_cuda.h"
16#include "../utils/basic_structs.h"
17#include "../utils/gpu.hpp"
18#include "../utils/math_utilities.h"
19#include "../utils/mhd_utilities.h"
34inline __host__ __device__ Real Calc_Pressure_Primitive(Real
const &E, Real
const &d, Real
const &vx, Real
const &vy,
35 Real
const &vz, Real
const &gamma, Real
const &magnetic_x = 0.0,
36 Real
const &magnetic_y = 0.0, Real
const &magnetic_z = 0.0)
44 return fmax((gamma - 1.) * pressure, TINY_NUMBER);
47inline __host__ __device__ Real Calc_Pressure_Conserved(Real
const &E, Real
const &d, Real
const &mx, Real
const &my,
48 Real
const &mz, Real
const &gamma, Real
const &magnetic_x = 0.0,
49 Real
const &magnetic_y = 0.0, Real
const &magnetic_z = 0.0)
57 return fmax((gamma - 1.) * pressure, TINY_NUMBER);
60inline __host__ __device__ Real Calc_Temp(Real
const &P, Real
const &n)
62 Real T = P * PRESSURE_UNIT / (n * KB);
81inline __host__ __device__ Real
Calc_Temp_Conserved(Real
const E, Real
const d, Real
const mx, Real
const my,
82 Real
const mz, Real
const gamma, Real
const n,
83 Real
const magnetic_x = 0.0, Real
const magnetic_y = 0.0,
84 Real
const magnetic_z = 0.0)
86 Real
const P = Calc_Pressure_Conserved(E, d, mx, my, mz, gamma, magnetic_x, magnetic_y, magnetic_z);
87 return Calc_Temp(P, n);
100inline __host__ __device__ Real Calc_Temp_DE(Real
const gas_energy, Real
const gamma, Real
const n)
102 return gas_energy * (gamma - 1.0) * PRESSURE_UNIT / (n * KB);
106inline __host__ __device__ Real Calc_Energy_Primitive(Real
const &P, Real
const &d, Real
const &vx, Real
const &vy,
107 Real
const &vz, Real
const &gamma, Real
const &magnetic_x = 0.0,
108 Real
const &magnetic_y = 0.0, Real
const &magnetic_z = 0.0)
120inline __host__ __device__ Real Calc_Energy_Conserved(Real
const &P, Real
const &d, Real
const &momentum_x,
121 Real
const &momentum_y, Real
const &momentum_z, Real
const &gamma,
122 Real
const &magnetic_x = 0.0, Real
const &magnetic_y = 0.0,
123 Real
const &magnetic_z = 0.0)
126 Real energy = (fmax(P, TINY_NUMBER) / (gamma - 1.)) +
127 (0.5 / d) * math_utils::SquareMagnitude(momentum_x, momentum_y, momentum_z);
136inline __host__ __device__ Real Get_Pressure_From_DE(Real
const &E, Real
const &U_total, Real
const &U_advected,
143 if (U_total / E > eta) {
148 P = U * (gamma - 1.0);
149 return fmax(P, (Real)TINY_NUMBER);
165 return 0.5 * d * math_utils::SquareMagnitude(vx, vy, vz);
180 return (0.5 / d) * math_utils::SquareMagnitude(mx, my, mz);
194inline __host__ __device__ Real
Calc_Sound_Speed(Real
const &E, Real
const &d, Real
const &mx, Real
const &my,
195 Real
const &mz, Real
const &gamma)
197 Real P = Calc_Pressure_Conserved(E, d, mx, my, mz, gamma);
198 return sqrt(gamma * P / d);
209inline __host__ __device__ Real
Calc_Sound_Speed(Real
const &P, Real
const &d, Real
const &gamma)
211 return sqrt(gamma * P / d);
232template <u
int dir = 0>
234 size_t const zid,
size_t const nx,
size_t const ny,
235 size_t const n_cells)
238 static_assert((0 <= dir) and (dir <= 2),
"dir is not in the proper range");
241 size_t const cell_id = cuda_utilities::compute1DIndex(xid, yid, zid, nx, ny);
247 loaded_data.density = dev_conserved[cell_id + n_cells * grid_enum::density];
248 loaded_data.momentum.
x() = dev_conserved[cell_id + n_cells * grid_enum::momentum_x];
249 loaded_data.momentum.y() = dev_conserved[cell_id + n_cells * grid_enum::momentum_y];
250 loaded_data.momentum.z() = dev_conserved[cell_id + n_cells * grid_enum::momentum_z];
251 loaded_data.energy = dev_conserved[cell_id + n_cells * grid_enum::Energy];
255 loaded_data.magnetic = mhd::utils::cellCenteredMagneticFields(dev_conserved, cell_id, xid, yid, zid, n_cells, nx, ny);
259 loaded_data.gas_energy = dev_conserved[cell_id + n_cells * grid_enum::GasEnergy];
263 for (
size_t i = 0; i < grid_enum::nscalars; i++) {
264 loaded_data.scalar[i] = dev_conserved[cell_id + n_cells * (grid_enum::scalar + i)];
270 if constexpr (dir == 1) {
271 math_utils::Cyclic_Permute_Once(loaded_data.momentum);
273 math_utils::Cyclic_Permute_Once(loaded_data.magnetic);
275 }
else if constexpr (dir == 2) {
276 math_utils::Cyclic_Permute_Twice(loaded_data.momentum);
278 math_utils::Cyclic_Permute_Twice(loaded_data.magnetic);
299 output.density = conserved_in.density;
300 output.velocity.
x() = conserved_in.momentum.
x() / conserved_in.density;
301 output.velocity.y() = conserved_in.momentum.y() / conserved_in.density;
302 output.velocity.z() = conserved_in.momentum.z() / conserved_in.density;
305 output.magnetic.x() = conserved_in.magnetic.x();
306 output.magnetic.y() = conserved_in.magnetic.y();
307 output.magnetic.z() = conserved_in.magnetic.z();
311 output.gas_energy = conserved_in.gas_energy / conserved_in.density;
315 for (
size_t i = 0; i < grid_enum::nscalars; i++) {
316 output.scalar[i] = conserved_in.scalar[i] / conserved_in.density;
323 output.velocity.y(), output.velocity.z());
326 E_non_thermal += mhd::utils::computeMagneticEnergy(output.magnetic.x(), output.magnetic.y(), output.magnetic.z());
329 output.pressure = hydro_utilities::Get_Pressure_From_DE(conserved_in.energy, conserved_in.energy - E_non_thermal,
330 conserved_in.gas_energy, gamma);
333 output.pressure = hydro_utilities::Calc_Pressure_Primitive(
334 conserved_in.energy, conserved_in.density, output.velocity.
x(), output.velocity.y(), output.velocity.z(), gamma,
335 output.magnetic.x(), output.magnetic.y(), output.magnetic.z());
337 output.pressure = hydro_utilities::Calc_Pressure_Primitive(
338 conserved_in.energy, conserved_in.density, output.velocity.
x(), output.velocity.y(), output.velocity.z(), gamma);
359 output.density = primitive_in.density;
360 output.momentum.
x() = primitive_in.velocity.
x() * primitive_in.density;
361 output.momentum.y() = primitive_in.velocity.y() * primitive_in.density;
362 output.momentum.z() = primitive_in.velocity.z() * primitive_in.density;
365 output.magnetic.x() = primitive_in.magnetic.x();
366 output.magnetic.y() = primitive_in.magnetic.y();
367 output.magnetic.z() = primitive_in.magnetic.z();
371 output.gas_energy = primitive_in.gas_energy * primitive_in.density;
375 for (
size_t i = 0; i < grid_enum::nscalars; i++) {
376 output.scalar[i] = primitive_in.scalar[i] * primitive_in.density;
382 output.energy = hydro_utilities::Calc_Energy_Primitive(primitive_in.pressure, primitive_in.density,
383 primitive_in.velocity.
x(), primitive_in.velocity.y(),
384 primitive_in.velocity.z(), gamma, primitive_in.magnetic.x(),
385 primitive_in.magnetic.y(), primitive_in.magnetic.z());
388 hydro_utilities::Calc_Energy_Primitive(primitive_in.pressure, primitive_in.density, primitive_in.velocity.
x(),
389 primitive_in.velocity.y(), primitive_in.velocity.z(), gamma);
415template <u
int dir = 0>
417 size_t const zid,
size_t const nx,
size_t const ny,
418 size_t const n_cells, Real
const gamma)
420 Conserved const conserved_cell = Load_Cell_Conserved<dir>(dev_conserved, xid, yid, zid, nx, ny, n_cells);
__device__ __host__ Real SquareMagnitude(Real const &v1, Real const &v2, Real const &v3)
Compute the magnitude of a vector.
Definition math_utilities.h:96
__host__ __device__ Real computeMagneticEnergy(Real const &magneticX, Real const &magneticY, Real const &magneticZ)
Compute the magnetic energy.
Definition mhd_utilities.h:76
Definition basic_structs.h:15
__host__ __device__ Primitive Conserved_2_Primitive(Conserved const &conserved_in, Real const gamma)
Convert Conserved cell centered variables to primitive variables.
Definition hydro_utilities.h:294
__host__ __device__ Conserved Primitive_2_Conserved(Primitive const &primitive_in, Real const gamma)
Convert primitive cell centered variables to conserved variables.
Definition hydro_utilities.h:354
__host__ __device__ Real Calc_Temp_Conserved(Real const E, Real const d, Real const mx, Real const my, Real const mz, Real const gamma, Real const n, Real const magnetic_x=0.0, Real const magnetic_y=0.0, Real const magnetic_z=0.0)
Compute the temperature from the conserved variables.
Definition hydro_utilities.h:81
__host__ __device__ Real Calc_Sound_Speed(Real const &E, Real const &d, Real const &mx, Real const &my, Real const &mz, Real const &gamma)
Compute the sound speed in the cell from conserved variables.
Definition hydro_utilities.h:194
__host__ __device__ Primitive Load_Cell_Primitive(Real const *dev_conserved, size_t const xid, size_t const yid, size_t const zid, size_t const nx, size_t const ny, size_t const n_cells, Real const gamma)
Load the primitive variables from a single cell. Note that with MHD this returns cell-centered magnet...
Definition hydro_utilities.h:416
__host__ __device__ Real Calc_Kinetic_Energy_From_Momentum(Real const &d, Real const &mx, Real const &my, Real const &mz)
Compute the kinetic energy from the density and momenta.
Definition hydro_utilities.h:177
__host__ __device__ Real Calc_Kinetic_Energy_From_Velocity(Real const &d, Real const &vx, Real const &vy, Real const &vz)
Compute the kinetic energy from the density and velocities.
Definition hydro_utilities.h:162
__host__ __device__ Conserved Load_Cell_Conserved(Real const *dev_conserved, size_t const xid, size_t const yid, size_t const zid, size_t const nx, size_t const ny, size_t const n_cells)
Load the conserved variables from a single cell. Note that with MHD this returns cell-centered magnet...
Definition hydro_utilities.h:233
A data only struct for the conserved variables.
Definition basic_structs.h:83
A data only struct for the primitive variables.
Definition basic_structs.h:124
__device__ __host__ T & x() noexcept
Directly access the x, y, and z elements. Const version is needed if the object instance is declared ...
Definition basic_structs.h:68