more pressurecell work
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-12-15 22:16:04 -05:00
parent f009326ed3
commit 757a4aa409
2 changed files with 130 additions and 38 deletions

View File

@ -2,6 +2,7 @@
#include "fluid/sim/pressurecell/density.h" #include "fluid/sim/pressurecell/density.h"
#include "fluid/sim/pressurecell/solver_consts.h" #include "fluid/sim/pressurecell/solver_consts.h"
#include "math/ode/multigrid_parallel.h"
/** /**
* Adds density from the delta buffer to this chunk * Adds density from the delta buffer to this chunk
@ -26,29 +27,56 @@ LIBRARY_API void pressurecell_diffuse_density(Environment * environment, Chunk *
int x, y, z; int x, y, z;
float * densityArr = chunk->d[CENTER_LOC]; float * densityArr = chunk->d[CENTER_LOC];
float * densityTemp = chunk->dTempCache; float * densityTemp = chunk->dTempCache;
float D = FLUID_PRESSURECELL_DIFFUSION_CONSTANT * environment->consts.dt; float a = FLUID_PRESSURECELL_DIFFUSION_CONSTANT * environment->consts.dt / (FLUID_PRESSURECELL_SPACING * FLUID_PRESSURECELL_SPACING);
float c = 1+6*a;
// float residual = 1;
// int iterations = 0;
// while(iterations < FLUID_GRID2_SOLVER_MULTIGRID_MAX_ITERATIONS && (residual > FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE || residual < -FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE)){
// residual = solver_multigrid_parallel_iterate(densityTemp,densityArr,a,c);
// // fluid_grid2_set_bounds(environment,BOUND_SET_DENSITY_PHI,x);
// for(x = 1; x < DIM-1; x++){
// for(y = 1; y < DIM-1; y++){
// //diffuse back into the grid
// densityTemp[IX(0,x,y)] = 0;
// densityTemp[IX(DIM-1,x,y)] = 0;
// densityTemp[IX(x,0,y)] = 0;
// densityTemp[IX(x,DIM-1,y)] = 0;
// densityTemp[IX(x,y,0)] = 0;
// densityTemp[IX(x,y,DIM-1)] = 0;
// }
// }
// iterations++;
// }
for(z = 1; z < DIM-1; z++){ for(z = 1; z < DIM-1; z++){
for(y = 1; y < DIM-1; y++){ for(y = 1; y < DIM-1; y++){
for(x = 1; x < DIM-1; x++){ for(x = 1; x < DIM-1; x++){
densityTemp[IX(x,y,z)] = densityArr[IX(x,y,z)] + densityTemp[IX(x,y,z)] = densityArr[IX(x,y,z)] +
densityArr[IX(x,y,z)] * -6 * D + (
densityArr[IX(x-1,y,z)] * D + densityArr[IX(x,y,z)] * -6 +
densityArr[IX(x+1,y,z)] * D + (
densityArr[IX(x,y-1,z)] * D + densityArr[IX(x-1,y,z)] +
densityArr[IX(x,y+1,z)] * D + densityArr[IX(x+1,y,z)] +
densityArr[IX(x,y,z-1)] * D + densityArr[IX(x,y-1,z)] +
densityArr[IX(x,y,z+1)] * D densityArr[IX(x,y+1,z)] +
densityArr[IX(x,y,z-1)] +
densityArr[IX(x,y,z+1)]
)
) * a
; ;
} }
} }
} }
// for(z = 1; z < DIM-1; z++){ for(x = 1; x < DIM-1; x++){
// for(y = 1; y < DIM-1; y++){ for(y = 1; y < DIM-1; y++){
// for(x = 1; x < DIM-1; x++){ //diffuse back into the grid
// densityArr[IX(x,y,z)] = densityTemp[IX(x,y,z)]; densityTemp[IX(1,x,y)] = densityTemp[IX(1,x,y)] + densityTemp[IX(0,x,y)];
// } densityTemp[IX(DIM-2,x,y)] = densityTemp[IX(DIM-2,x,y)] + densityTemp[IX(DIM-1,x,y)];
// } densityTemp[IX(x,1,y)] = densityTemp[IX(x,1,y)] + densityTemp[IX(x,0,y)];
// } densityTemp[IX(x,DIM-2,y)] = densityTemp[IX(x,DIM-2,y)] + densityTemp[IX(x,DIM-1,y)];
densityTemp[IX(x,y,1)] = densityTemp[IX(x,y,1)] + densityTemp[IX(x,y,0)];
densityTemp[IX(x,y,DIM-2)] = densityTemp[IX(x,y,DIM-2)] + densityTemp[IX(x,y,DIM-1)];
}
}
} }
/** /**

View File

@ -3,6 +3,7 @@
#include "fluid/queue/chunk.h" #include "fluid/queue/chunk.h"
#include "fluid/sim/pressurecell/velocity.h" #include "fluid/sim/pressurecell/velocity.h"
#include "fluid/sim/pressurecell/solver_consts.h" #include "fluid/sim/pressurecell/solver_consts.h"
#include "math/ode/multigrid_parallel.h"
/** /**
@ -59,18 +60,73 @@ LIBRARY_API void pressurecell_diffuse_velocity(Environment * environment, Chunk
float * uTemp = chunk->uTempCache; float * uTemp = chunk->uTempCache;
float * vTemp = chunk->vTempCache; float * vTemp = chunk->vTempCache;
float * wTemp = chunk->wTempCache; float * wTemp = chunk->wTempCache;
float D = FLUID_PRESSURECELL_DIFFUSION_CONSTANT * environment->consts.dt / (FLUID_PRESSURECELL_SPACING * FLUID_PRESSURECELL_SPACING); float a = FLUID_PRESSURECELL_DIFFUSION_CONSTANT * environment->consts.dt / (FLUID_PRESSURECELL_SPACING * FLUID_PRESSURECELL_SPACING);
float c = 1+6*a;
// float residual = 1;
// int iterations = 0;
// while(iterations < FLUID_GRID2_SOLVER_MULTIGRID_MAX_ITERATIONS && (residual > FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE || residual < -FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE)){
// residual = solver_multigrid_parallel_iterate(uArr,uTemp,a,c);
// // fluid_grid2_set_bounds(environment,BOUND_SET_DENSITY_PHI,x);
// for(x = 1; x < DIM-1; x++){
// for(y = 1; y < DIM-1; y++){
// //diffuse back into the grid
// uArr[IX(0,x,y)] = 0;
// uArr[IX(DIM-1,x,y)] = 0;
// uArr[IX(x,0,y)] = 0;
// uArr[IX(x,DIM-1,y)] = 0;
// uArr[IX(x,y,0)] = 0;
// uArr[IX(x,y,DIM-1)] = 0;
// }
// }
// iterations++;
// }
// while(iterations < FLUID_GRID2_SOLVER_MULTIGRID_MAX_ITERATIONS && (residual > FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE || residual < -FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE)){
// residual = solver_multigrid_parallel_iterate(vArr,vTemp,a,c);
// for(x = 1; x < DIM-1; x++){
// for(y = 1; y < DIM-1; y++){
// //diffuse back into the grid
// vArr[IX(0,x,y)] = 0;
// vArr[IX(DIM-1,x,y)] = 0;
// vArr[IX(x,0,y)] = 0;
// vArr[IX(x,DIM-1,y)] = 0;
// vArr[IX(x,y,0)] = 0;
// vArr[IX(x,y,DIM-1)] = 0;
// }
// }
// // fluid_grid2_set_bounds(environment,BOUND_SET_DENSITY_PHI,x);
// iterations++;
// }
// while(iterations < FLUID_GRID2_SOLVER_MULTIGRID_MAX_ITERATIONS && (residual > FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE || residual < -FLUID_GRID2_SOLVER_MULTIGRID_TOLERANCE)){
// residual = solver_multigrid_parallel_iterate(wArr,wTemp,a,c);
// // fluid_grid2_set_bounds(environment,BOUND_SET_DENSITY_PHI,x);
// for(x = 1; x < DIM-1; x++){
// for(y = 1; y < DIM-1; y++){
// //diffuse back into the grid
// wArr[IX(0,x,y)] = 0;
// wArr[IX(DIM-1,x,y)] = 0;
// wArr[IX(x,0,y)] = 0;
// wArr[IX(x,DIM-1,y)] = 0;
// wArr[IX(x,y,0)] = 0;
// wArr[IX(x,y,DIM-1)] = 0;
// }
// }
// iterations++;
// }
for(z = 1; z < DIM-1; z++){ for(z = 1; z < DIM-1; z++){
for(y = 1; y < DIM-1; y++){ for(y = 1; y < DIM-1; y++){
for(x = 1; x < DIM-1; x++){ for(x = 1; x < DIM-1; x++){
uArr[IX(x,y,z)] = uTemp[IX(x,y,z)] + uArr[IX(x,y,z)] = uTemp[IX(x,y,z)] +
uTemp[IX(x,y,z)] * -6 * D + (
uTemp[IX(x-1,y,z)] * D + uTemp[IX(x,y,z)] * -6 +
uTemp[IX(x+1,y,z)] * D + (
uTemp[IX(x,y-1,z)] * D + uTemp[IX(x-1,y,z)] +
uTemp[IX(x,y+1,z)] * D + uTemp[IX(x+1,y,z)] +
uTemp[IX(x,y,z-1)] * D + uTemp[IX(x,y-1,z)] +
uTemp[IX(x,y,z+1)] * D uTemp[IX(x,y+1,z)] +
uTemp[IX(x,y,z-1)] +
uTemp[IX(x,y,z+1)]
)
) * c
; ;
} }
} }
@ -80,13 +136,17 @@ LIBRARY_API void pressurecell_diffuse_velocity(Environment * environment, Chunk
for(y = 1; y < DIM-1; y++){ for(y = 1; y < DIM-1; y++){
for(x = 1; x < DIM-1; x++){ for(x = 1; x < DIM-1; x++){
vArr[IX(x,y,z)] = vTemp[IX(x,y,z)] + vArr[IX(x,y,z)] = vTemp[IX(x,y,z)] +
vTemp[IX(x,y,z)] * -6 * D + (
vTemp[IX(x-1,y,z)] * D + vTemp[IX(x,y,z)] * -6 +
vTemp[IX(x+1,y,z)] * D + (
vTemp[IX(x,y-1,z)] * D + vTemp[IX(x-1,y,z)] +
vTemp[IX(x,y+1,z)] * D + vTemp[IX(x+1,y,z)] +
vTemp[IX(x,y,z-1)] * D + vTemp[IX(x,y-1,z)] +
vTemp[IX(x,y,z+1)] * D vTemp[IX(x,y+1,z)] +
vTemp[IX(x,y,z-1)] +
vTemp[IX(x,y,z+1)]
)
) * c
; ;
} }
} }
@ -96,13 +156,17 @@ LIBRARY_API void pressurecell_diffuse_velocity(Environment * environment, Chunk
for(y = 1; y < DIM-1; y++){ for(y = 1; y < DIM-1; y++){
for(x = 1; x < DIM-1; x++){ for(x = 1; x < DIM-1; x++){
wArr[IX(x,y,z)] = wTemp[IX(x,y,z)] + wArr[IX(x,y,z)] = wTemp[IX(x,y,z)] +
wTemp[IX(x,y,z)] * -6 * D + (
wTemp[IX(x-1,y,z)] * D + wTemp[IX(x,y,z)] * -6 +
wTemp[IX(x+1,y,z)] * D + (
wTemp[IX(x,y-1,z)] * D + wTemp[IX(x-1,y,z)] +
wTemp[IX(x,y+1,z)] * D + wTemp[IX(x+1,y,z)] +
wTemp[IX(x,y,z-1)] * D + wTemp[IX(x,y-1,z)] +
wTemp[IX(x,y,z+1)] * D wTemp[IX(x,y+1,z)] +
wTemp[IX(x,y,z-1)] +
wTemp[IX(x,y,z+1)]
)
) * c
; ;
} }
} }
@ -125,7 +189,7 @@ LIBRARY_API void pressurecell_advect_velocity(Environment * environment, Chunk *
float s0, s1, t0, t1, u0, u1; float s0, s1, t0, t1, u0, u1;
float interpolatedU, interpolatedV, interpolatedW; float interpolatedU, interpolatedV, interpolatedW;
float magnitude; float magnitude;
float interpConst = environment->consts.dt / FLUID_PRESSURECELL_SPACING; float interpConst = environment->consts.dt / (FLUID_PRESSURECELL_SPACING * FLUID_PRESSURECELL_SPACING);
for(y = 1; y < DIM-1; y++){ for(y = 1; y < DIM-1; y++){
for(z = 1; z < DIM-1; z++){ for(z = 1; z < DIM-1; z++){
for(x = 1; x < DIM-1; x++){ for(x = 1; x < DIM-1; x++){