diff --git a/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h b/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h index a476bf99..aef63601 100644 --- a/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h +++ b/src/main/c/includes/fluid/sim/pressurecell/solver_consts.h @@ -10,7 +10,7 @@ /** * Spacing of cells */ -#define FLUID_PRESSURECELL_SPACING 1.0f +#define FLUID_PRESSURECELL_SPACING (1.0f/DIM) /** * Multiplier applied to pressure calculations to encourage advection @@ -25,12 +25,12 @@ /** * Diffusion constant */ -#define FLUID_PRESSURECELL_DIFFUSION_CONSTANT 0.1f +#define FLUID_PRESSURECELL_DIFFUSION_CONSTANT 0.01f /** * Viscosity constant */ -#define FLUID_PRESSURECELL_VISCOSITY_CONSTANT 0.1f +#define FLUID_PRESSURECELL_VISCOSITY_CONSTANT 0.01f /** * Amount of the residual to add to the pressure field each frame @@ -52,15 +52,15 @@ */ #define FLUID_PRESSURECELL_PROJECTION_CONVERGENCE_TOLERANCE 0.01f -/** - * The minimum pressure allowed - */ -#define FLUID_PRESSURECELL_MIN_PRESSURE -10000.0f - /** * The maximum pressure allowed */ -#define FLUID_PRESSURECELL_MAX_PRESSURE 10000.0f +#define FLUID_PRESSURECELL_MAX_PRESSURE 1000.0f + +/** + * The minimum pressure allowed + */ +#define FLUID_PRESSURECELL_MIN_PRESSURE -FLUID_PRESSURECELL_MAX_PRESSURE /** * Percentage of presure to keep from last frame diff --git a/src/main/c/src/fluid/sim/pressurecell/normalization.c b/src/main/c/src/fluid/sim/pressurecell/normalization.c index 5247b433..940b60fd 100644 --- a/src/main/c/src/fluid/sim/pressurecell/normalization.c +++ b/src/main/c/src/fluid/sim/pressurecell/normalization.c @@ -71,9 +71,9 @@ LIBRARY_API void fluid_pressurecell_normalize_chunk(Environment * env, Chunk * c LIBRARY_API void fluid_pressurecell_recapture_density(Environment * env, Chunk * chunk){ int x, y; float * dArr = chunk->d[CENTER_LOC]; - float * uArr = chunk->u[CENTER_LOC]; - float * vArr = chunk->v[CENTER_LOC]; - float * wArr = chunk->w[CENTER_LOC]; + float * uArr = chunk->uTempCache; + float * vArr = chunk->vTempCache; + float * wArr = chunk->wTempCache; int ghostIndex, adjacentIndex; float overdraw, estimatedLoss, invertedForce; //clear neighbor outgoing values diff --git a/src/main/c/src/fluid/sim/pressurecell/pressure.c b/src/main/c/src/fluid/sim/pressurecell/pressure.c index 91608f48..c2f44c8c 100644 --- a/src/main/c/src/fluid/sim/pressurecell/pressure.c +++ b/src/main/c/src/fluid/sim/pressurecell/pressure.c @@ -157,7 +157,7 @@ LIBRARY_API void pressurecell_approximate_pressure(Environment * environment, Ch for(z = 1; z < DIM-1; z++){ for(y = 1; y < DIM-1; y++){ for(x = 1; x < DIM; x++){ - if(pressureTemp[IX(x,y,z)] > 10000.0f){ + if(pressureTemp[IX(x,y,z)] > FLUID_PRESSURECELL_MAX_PRESSURE){ printf("Invalid pressure!\n"); printf("%f %f \n", phi0[IX(x-1,y,z)], phi0[IX(x+1,y,z)]); printf("\n"); @@ -202,17 +202,20 @@ LIBRARY_API void pressurecell_approximate_pressure(Environment * environment, Ch for(z = 1; z < DIM-1; z++){ for(y = 1; y < DIM-1; y++){ for(x = 1; x < DIM; x++){ - if(pressureTemp[IX(x,y,z)] > pressureMax){ + if(fabs(pressureTemp[IX(x,y,z)]) > pressureMax){ pressureMax = pressureTemp[IX(x,y,z)]; } } } } - for(z = 1; z < DIM-1; z++){ - for(y = 1; y < DIM-1; y++){ - for(x = 1; x < DIM; x++){ - if(pressureTemp[IX(x,y,z)] > pressureMax){ - pressureTemp[IX(x,y,z)] = pressureTemp[IX(x,y,z)] / pressureMax; + if(pressureMax > FLUID_PRESSURECELL_MAX_PRESSURE){ + printf("pressureMax: %f \n",pressureMax); + for(z = 1; z < DIM-1; z++){ + for(y = 1; y < DIM-1; y++){ + for(x = 1; x < DIM; x++){ + if(pressureTemp[IX(x,y,z)] > pressureMax){ + pressureTemp[IX(x,y,z)] = pressureTemp[IX(x,y,z)] / pressureMax; + } } } } diff --git a/src/main/c/src/fluid/sim/pressurecell/pressurecell.c b/src/main/c/src/fluid/sim/pressurecell/pressurecell.c index 9dddcfb9..daab4520 100644 --- a/src/main/c/src/fluid/sim/pressurecell/pressurecell.c +++ b/src/main/c/src/fluid/sim/pressurecell/pressurecell.c @@ -107,12 +107,6 @@ LIBRARY_API void fluid_pressurecell_simulate( pressurecell_advect_velocity(environment,currentChunk); } - for(int i = 0; i < numChunks; i++){ - Chunk * currentChunk = chunks[i]; - //uTemp->div - pressurecell_enforce_bounds(environment,currentChunk); - } - // printf("approx div\n"); // fflush(stdout); for(int i = 0; i < numChunks; i++){ @@ -144,8 +138,10 @@ LIBRARY_API void fluid_pressurecell_simulate( // printf("adv dens\n"); // fflush(stdout); for(int i = 0; i < numChunks; i++){ + //uTemp->d Chunk * currentChunk = chunks[i]; pressurecell_advect_density(environment,currentChunk); + fluid_pressurecell_recapture_density(environment,currentChunk); } @@ -159,7 +155,6 @@ LIBRARY_API void fluid_pressurecell_simulate( for(int i = 0; i < numChunks; i++){ Chunk * currentChunk = chunks[i]; fluid_pressurecell_normalize_chunk(environment,currentChunk); - fluid_pressurecell_recapture_density(environment,currentChunk); pressurecell_copy_for_next_frame(environment,currentChunk); fluid_pressurecell_clearArr(currentChunk->d0[CENTER_LOC]); fluid_pressurecell_clearArr(currentChunk->u0[CENTER_LOC]);