move iterator inside diffuse funcs

This commit is contained in:
austin 2024-12-11 11:44:45 -05:00
parent 58a9bafa4d
commit 8aab5319b5
5 changed files with 146 additions and 117 deletions

View File

@ -7,11 +7,6 @@
*/ */
#define FLUID_GRID2_LINEARSOLVERTIMES 2 #define FLUID_GRID2_LINEARSOLVERTIMES 2
/**
* The number of times to relax the vector diffusion solver
*/
#define FLUID_GRID2_VECTOR_DIFFUSE_TIMES 2
/** /**
* Width of a single grid cell * Width of a single grid cell
*/ */

View File

@ -52,7 +52,8 @@ LIBRARY_API void fluid_grid2_solveDiffuseDensity(
__m256 aScalar = _mm256_set1_ps(a); __m256 aScalar = _mm256_set1_ps(a);
__m256 cScalar = _mm256_set1_ps(c); __m256 cScalar = _mm256_set1_ps(c);
//transform u direction for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
//iterate
for(k=1; k<DIM-1; k++){ for(k=1; k<DIM-1; k++){
for(j=1; j<DIM-1; j++){ for(j=1; j<DIM-1; j++){
int n = 0; int n = 0;
@ -77,6 +78,10 @@ LIBRARY_API void fluid_grid2_solveDiffuseDensity(
} }
} }
} }
//set bounds
fluid_grid2_set_bounds(0,x);
}
} }
/** /**

View File

@ -80,18 +80,8 @@ LIBRARY_API void fluid_grid2_simulate(
fluid_grid2_flip_arrays(currentChunk->v,currentChunk->v0); fluid_grid2_flip_arrays(currentChunk->v,currentChunk->v0);
fluid_grid2_flip_arrays(currentChunk->w,currentChunk->w0); fluid_grid2_flip_arrays(currentChunk->w,currentChunk->w0);
//solve vector diffusion
for(int l = 0; l < FLUID_GRID2_VECTOR_DIFFUSE_TIMES; l++){
//solve vector diffusion //solve vector diffusion
fluid_grid2_solveVectorDiffuse(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,timestep); fluid_grid2_solveVectorDiffuse(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,timestep);
//update array for vectors
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,currentChunk->u0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,currentChunk->v0[CENTER_LOC]);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,currentChunk->w0[CENTER_LOC]);
}
//setup projection //setup projection
fluid_grid2_setupProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep); fluid_grid2_setupProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
@ -182,10 +172,8 @@ LIBRARY_API void fluid_grid2_simulate(
//swap vector fields //swap vector fields
fluid_grid2_flip_arrays(currentChunk->d,currentChunk->d0); fluid_grid2_flip_arrays(currentChunk->d,currentChunk->d0);
//diffuse density //diffuse density
for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
fluid_grid2_solveDiffuseDensity(currentChunk->d,currentChunk->d0,timestep); fluid_grid2_solveDiffuseDensity(currentChunk->d,currentChunk->d0,timestep);
fluid_grid2_set_bounds(0,currentChunk->d[CENTER_LOC]); fluid_grid2_set_bounds(0,currentChunk->d[CENTER_LOC]);
}
//swap all density arrays //swap all density arrays
//swap vector fields //swap vector fields
fluid_grid2_flip_arrays(currentChunk->d,currentChunk->d0); fluid_grid2_flip_arrays(currentChunk->d,currentChunk->d0);
@ -242,6 +230,22 @@ LIBRARY_API void fluid_grid2_simulate(
} }
/**
* Saves a step of the simulation to a file
*/
static inline void fluid_grid2_saveStep(float * values, const char * name){ static inline void fluid_grid2_saveStep(float * values, const char * name){
if(SAVE_STEPS){ if(SAVE_STEPS){
FILE *fp; FILE *fp;
@ -346,8 +350,19 @@ static inline void fluid_grid2_apply_bounds_mask(float * realArr, float * bounds
_mm256_storeu_ps(&realArr[IX(x,y,z)],finalVec); _mm256_storeu_ps(&realArr[IX(x,y,z)],finalVec);
//middle part
x = 8;
//border part
maskedBounds = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(x,y,z)]);
//real part
realVal = _mm256_loadu_ps(&realArr[IX(x,y,z)]);
invertedMask = _mm256_loadu_ps(&fluid_grid2_border_mask_inverted[IX(x,y,z)]);
realPart = _mm256_mul_ps(realVal,invertedMask);
finalVec = _mm256_add_ps(realPart,maskedBounds);
_mm256_storeu_ps(&realArr[IX(x,y,z)],finalVec);
//upper part //upper part
x = 2; x = 10;
//border part //border part
maskedBounds = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(x,y,z)]); maskedBounds = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(x,y,z)]);
//real part //real part
@ -382,19 +397,29 @@ static inline void fluid_grid2_apply_neighbors(Chunk * chunk){
*/ */
static inline void fluid_grid2_populate_masked_arr(float * sourceArr, float * workingArr){ static inline void fluid_grid2_populate_masked_arr(float * sourceArr, float * workingArr){
__m256 arrVal, maskVal, masked; __m256 arrVal, maskVal, masked;
int x;
for(int z = 0; z < 18; z++){ for(int z = 0; z < 18; z++){
for(int y = 0; y < 18; y++){ for(int y = 0; y < 18; y++){
//lower part //lower part
arrVal = _mm256_loadu_ps(&sourceArr[IX(0,y,z)]); x = 0;
maskVal = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(0,y,z)]); arrVal = _mm256_loadu_ps(&sourceArr[IX(x,y,z)]);
maskVal = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(x,y,z)]);
masked = _mm256_mul_ps(arrVal,maskVal); masked = _mm256_mul_ps(arrVal,maskVal);
_mm256_storeu_ps(&workingArr[IX(0,y,z)],masked); _mm256_storeu_ps(&workingArr[IX(x,y,z)],masked);
//middle part
x = 8;
arrVal = _mm256_loadu_ps(&sourceArr[IX(x,y,z)]);
maskVal = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(x,y,z)]);
masked = _mm256_mul_ps(arrVal,maskVal);
_mm256_storeu_ps(&workingArr[IX(x,y,z)],masked);
//upper part //upper part
arrVal = _mm256_loadu_ps(&sourceArr[IX(2,y,z)]); x = 10;
maskVal = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(0,y,z)]); arrVal = _mm256_loadu_ps(&sourceArr[IX(x,y,z)]);
maskVal = _mm256_loadu_ps(&fluid_grid2_border_mask[IX(x,y,z)]);
masked = _mm256_mul_ps(arrVal,maskVal); masked = _mm256_mul_ps(arrVal,maskVal);
_mm256_storeu_ps(&workingArr[IX(0,y,z)],masked); _mm256_storeu_ps(&workingArr[IX(x,y,z)],masked);
} }
} }
} }

View File

@ -61,10 +61,10 @@ LIBRARY_API void fluid_grid2_solveVectorDiffuse (
__m256 aScalar = _mm256_set1_ps(a); __m256 aScalar = _mm256_set1_ps(a);
__m256 cScalar = _mm256_set1_ps(c); __m256 cScalar = _mm256_set1_ps(c);
for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
//transform u direction //transform u direction
for(k=1; k<DIM-1; k++){ for(k=1; k<DIM-1; k++){
for(j=1; j<DIM-1; j++){ for(j=1; j<DIM-1; j++){
int n = 0;
//solve as much as possible vectorized //solve as much as possible vectorized
for(i = 1; i < DIM-1; i=i+8){ for(i = 1; i < DIM-1; i=i+8){
__m256 vector = _mm256_loadu_ps(&u[IX(i-1,j,k)]); __m256 vector = _mm256_loadu_ps(&u[IX(i-1,j,k)]);
@ -90,7 +90,6 @@ LIBRARY_API void fluid_grid2_solveVectorDiffuse (
//transform v direction //transform v direction
for(k=1; k<DIM-1; k++){ for(k=1; k<DIM-1; k++){
for(j=1; j<DIM-1; j++){ for(j=1; j<DIM-1; j++){
int n = 0;
//solve as much as possible vectorized //solve as much as possible vectorized
for(i = 1; i < DIM-1; i=i+8){ for(i = 1; i < DIM-1; i=i+8){
__m256 vector = _mm256_loadu_ps(&v[IX(i-1,j,k)]); __m256 vector = _mm256_loadu_ps(&v[IX(i-1,j,k)]);
@ -116,7 +115,6 @@ LIBRARY_API void fluid_grid2_solveVectorDiffuse (
//transform w direction //transform w direction
for(k=1; k<DIM-1; k++){ for(k=1; k<DIM-1; k++){
for(j=1; j<DIM-1; j++){ for(j=1; j<DIM-1; j++){
int n = 0;
//solve as much as possible vectorized //solve as much as possible vectorized
for(i = 1; i < DIM-1; i=i+8){ for(i = 1; i < DIM-1; i=i+8){
__m256 vector = _mm256_loadu_ps(&w[IX(i-1,j,k)]); __m256 vector = _mm256_loadu_ps(&w[IX(i-1,j,k)]);
@ -138,6 +136,12 @@ LIBRARY_API void fluid_grid2_solveVectorDiffuse (
} }
} }
} }
//set bounds
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_U,u);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_V,v);
fluid_grid2_set_bounds(FLUID_GRID2_BOUND_DIR_W,w);
}
} }
/** /**

View File

@ -53,7 +53,7 @@ int fluid_sim_grid2_velocity_diffuse_test1(){
fluid_grid2_flip_arrays(currentChunk->w,currentChunk->w0); fluid_grid2_flip_arrays(currentChunk->w,currentChunk->w0);
//diffuse density //diffuse density
//solve vector diffusion //solve vector diffusion
for(int l = 0; l < FLUID_GRID2_VECTOR_DIFFUSE_TIMES; l++){ for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
//solve vector diffusion //solve vector diffusion
fluid_grid2_solveVectorDiffuse(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_SIM_STEP); fluid_grid2_solveVectorDiffuse(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_SIM_STEP);
//update array for vectors //update array for vectors
@ -113,7 +113,7 @@ int fluid_sim_grid2_velocity_diffuse_test2(){
fluid_grid2_flip_arrays(currentChunk->w,currentChunk->w0); fluid_grid2_flip_arrays(currentChunk->w,currentChunk->w0);
//diffuse density //diffuse density
//solve vector diffusion //solve vector diffusion
for(int l = 0; l < FLUID_GRID2_VECTOR_DIFFUSE_TIMES; l++){ for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
//solve vector diffusion //solve vector diffusion
fluid_grid2_solveVectorDiffuse(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_SIM_STEP); fluid_grid2_solveVectorDiffuse(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_SIM_STEP);
//update array for vectors //update array for vectors