1 | /* |
---|
2 | * Copyright 1993-2009 NVIDIA Corporation. All rights reserved. |
---|
3 | * |
---|
4 | * NVIDIA Corporation and its licensors retain all intellectual property and |
---|
5 | * proprietary rights in and to this software and related documentation and |
---|
6 | * any modifications thereto. Any use, reproduction, disclosure, or distribution |
---|
7 | * of this software and related documentation without an express license |
---|
8 | * agreement from NVIDIA Corporation is strictly prohibited. |
---|
9 | * |
---|
10 | */ |
---|
11 | #ifndef __STABLEFLUIDS_KERNELS_H_ |
---|
12 | #define __STABLEFLUIDS_KERNELS_H_ |
---|
13 | |
---|
14 | // Vector data type used to velocity and force fields |
---|
15 | typedef float2 cData; |
---|
16 | |
---|
17 | void setupTexture(int x, int y); |
---|
18 | void bindTexture(void); |
---|
19 | void unbindTexture(void); |
---|
20 | void updateTexture(cData *data, size_t w, size_t h, size_t pitch); |
---|
21 | void deleteTexture(void); |
---|
22 | |
---|
23 | // This method adds constant force vectors to the velocity field |
---|
24 | // stored in 'v' according to v(x,t+1) = v(x,t) + dt * f. |
---|
25 | __global__ void |
---|
26 | addForces_k(cData *v, int dx, int dy, int spx, int spy, float fx, float fy, int r, size_t pitch); |
---|
27 | |
---|
28 | // This method performs the velocity advection step, where we |
---|
29 | // trace velocity vectors back in time to update each grid cell. |
---|
30 | // That is, v(x,t+1) = v(p(x,-dt),t). Here we perform bilinear |
---|
31 | // interpolation in the velocity space. |
---|
32 | __global__ void |
---|
33 | advectVelocity_k(cData *v, float *vx, float *vy, |
---|
34 | int dx, int pdx, int dy, float dt, int lb); |
---|
35 | |
---|
36 | // This method performs velocity diffusion and forces mass conservation |
---|
37 | // in the frequency domain. The inputs 'vx' and 'vy' are complex-valued |
---|
38 | // arrays holding the Fourier coefficients of the velocity field in |
---|
39 | // X and Y. Diffusion in this space takes a simple form described as: |
---|
40 | // v(k,t) = v(k,t) / (1 + visc * dt * k^2), where visc is the viscosity, |
---|
41 | // and k is the wavenumber. The projection step forces the Fourier |
---|
42 | // velocity vectors to be orthogonal to the wave wave vectors for each |
---|
43 | // wavenumber: v(k,t) = v(k,t) - ((k dot v(k,t) * k) / k^2. |
---|
44 | __global__ void |
---|
45 | diffuseProject_k(cData *vx, cData *vy, int dx, int dy, float dt, |
---|
46 | float visc, int lb); |
---|
47 | |
---|
48 | // This method updates the velocity field 'v' using the two complex |
---|
49 | // arrays from the previous step: 'vx' and 'vy'. Here we scale the |
---|
50 | // real components by 1/(dx*dy) to account for an unnormalized FFT. |
---|
51 | __global__ void |
---|
52 | updateVelocity_k(cData *v, float *vx, float *vy, |
---|
53 | int dx, int pdx, int dy, int lb, size_t pitch); |
---|
54 | |
---|
55 | // This method updates the particles by moving particle positions |
---|
56 | // according to the velocity field and time step. That is, for each |
---|
57 | // particle: p(t+1) = p(t) + dt * v(p(t)). |
---|
58 | __global__ void |
---|
59 | advectParticles_k(cData *part, cData *v, int dx, int dy, |
---|
60 | float dt, int lb, size_t pitch); |
---|
61 | |
---|
62 | #endif |
---|
63 | |
---|