Cholla 3.0.1-dev
Cholla - Massively parallel hydro on GPUs
Loading...
Searching...
No Matches
hlld_cuda.h
1
10#pragma once
11
12// External Includes
13
14// Local Includes
15#include "../global/global.h"
16#include "../reconstruction/reconstruction.h"
17#include "../utils/hydro_utilities.h"
18
19#ifdef MHD
24namespace mhd
25{
45template <int reconstruction, uint direction>
46__global__ void Calculate_HLLD_Fluxes_CUDA(Real const *dev_conserved, Real const *dev_bounds_L,
47 Real const *dev_bounds_R, Real const *dev_magnetic_face, Real *dev_flux,
48 int const nx, int const ny, int const nz, int const n_cells,
49 Real const gamma, int const n_fields);
50
56namespace internal
57{
62Real static const _hlldSmallNumber = 1.0e-8;
63
70struct StarState {
71 // velocityStarX = Speeds.M
72 // Total pressure is computed on its own since it's shared
73 Real density, velocityY, velocityZ, energy, magneticY, magneticZ;
74};
75
82struct DoubleStarState {
83 // velocityDoubleStarX = Speeds.M
84 // densityDoubleStar = densityStar
85 // pressureDoubleStar = pressureStar
86 // Shared values
87 Real velocityY, velocityZ, magneticY, magneticZ;
88 // Different values. Initializing these since one or the other can be uninitializing leading to bad tests
89 Real energyL = 0.0, energyR = 0.0;
90};
91
96struct Flux {
97 Real density, momentumX, momentumY, momentumZ, energy, magneticY, magneticZ;
98};
99
104struct Speeds {
105 Real L, LStar, M, RStar, R;
106};
107
121__device__ __host__ reconstruction::InterfaceState loadState(Real const *interfaceArr, Real const &magneticX,
122 Real const &gamma, int const &threadId, int const &n_cells,
123 int const &o1, int const &o2, int const &o3);
124
129__device__ __host__ mhd::internal::Speeds approximateLRWaveSpeeds(reconstruction::InterfaceState const &stateL,
130 reconstruction::InterfaceState const &stateR,
131 Real const &magneticX, Real const &gamma);
132
136__device__ __host__ Real approximateMiddleWaveSpeed(reconstruction::InterfaceState const &stateL,
137 reconstruction::InterfaceState const &stateR,
138 mhd::internal::Speeds const &speed);
139
144__device__ __host__ Real approximateStarWaveSpeed(mhd::internal::StarState const &starState,
145 mhd::internal::Speeds const &speed, Real const &magneticX,
146 Real const &side);
147
156__device__ __host__ mhd::internal::Flux nonStarFluxes(reconstruction::InterfaceState const &state,
157 Real const &magneticX);
158
172__device__ __host__ void returnFluxes(int const &threadId, int const &o1, int const &o2, int const &o3,
173 int const &n_cells, Real *dev_flux, mhd::internal::Flux const &flux,
174 reconstruction::InterfaceState const &state);
175
184__device__ __host__ Real starTotalPressure(reconstruction::InterfaceState const &stateL,
185 reconstruction::InterfaceState const &stateR,
186 mhd::internal::Speeds const &speed);
187
197__device__ __host__ mhd::internal::StarState computeStarState(reconstruction::InterfaceState const &state,
198 mhd::internal::Speeds const &speed, Real const &speedSide,
199 Real const &magneticX, Real const &totalPressureStar);
200
211__device__ __host__ mhd::internal::Flux starFluxes(mhd::internal::StarState const &starState,
213 mhd::internal::Flux const &flux, mhd::internal::Speeds const &speed,
214 Real const &speedSide);
215
226__device__ __host__ mhd::internal::DoubleStarState computeDoubleStarState(mhd::internal::StarState const &starStateL,
227 mhd::internal::StarState const &starStateR,
228 Real const &magneticX,
229 Real const &totalPressureStar,
230 mhd::internal::Speeds const &speed);
231
244__device__ __host__ mhd::internal::Flux computeDoubleStarFluxes(mhd::internal::DoubleStarState const &doubleStarState,
245 Real const &doubleStarStateEnergy,
246 mhd::internal::StarState const &starState,
248 mhd::internal::Flux const &flux,
249 mhd::internal::Speeds const &speed,
250 Real const &speedSide, Real const &speedSideStar);
251
260inline __host__ __device__ Real Calc_Pressure_Primitive(reconstruction::InterfaceState const &state,
261 Real const &magneticX, Real const &gamma)
262{
263 return hydro_utilities::Calc_Pressure_Primitive(state.energy, state.density, state.velocity.x(), state.velocity.y(),
264 state.velocity.z(), gamma, magneticX, state.magnetic.y(),
265 state.magnetic.z());
266}
267} // namespace internal
268} // end namespace mhd
269#endif // MHD
Namespace for MHD code.
Definition magnetic_divergence.h:26
__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
Definition basic_structs.h:165