density normalization work for pressurecell
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-12-15 10:29:34 -05:00
parent a26ed3a001
commit 0b1b693433
6 changed files with 116 additions and 64 deletions

View File

@ -33,4 +33,11 @@ edge boundaries
extension of the "warm up" idea
Run minified solver that just performs velocity step (no density)
when advecting, check if density is at the advection position
if there is density, pull it along as well and fully activate the empty chunk
if there is density, pull it along as well and fully activate the empty chunk
==current frame==
newest u,v,w depend on density (for grav)
neighboring divergences depend on newest u,v,w
pressure field depends on neighboring divergences
final u,v,w depends on pressure field
final density depends on final u,v,w

View File

@ -57,6 +57,16 @@ static char INTEREST_MODIFIER_DIMS[CHUNK_MAX_INTEREST_LEVEL+1] = {
*/
#define INTEREST(tree,level,x,y,z) tree[level][x/INTEREST_MODIFIER_DIMS[level]*INTEREST_MODIFIER_DIMS[level]*INTEREST_MODIFIER_DIMS[level]+(y/INTEREST_MODIFIER_DIMS[level])*INTEREST_MODIFIER_DIMS[level]+(z/INTEREST_MODIFIER_DIMS[level])]
/**
* The data for this chunk that is specific to the pressure cell method
*/
typedef struct {
/**
* The sum of density
*/
double densitySum;
} PressureCellData;
/**
* A chunk
*/
@ -141,11 +151,6 @@ typedef struct {
*/
int simLOD;
/**
* Octree that stores whether a location is of interest or not
*/
char ** interestTree;
/**
* The convergence of this chunk
*/
@ -155,6 +160,11 @@ typedef struct {
* The number of iterations this chunk took to project
*/
int projectionIterations;
/**
* The data for pressure cell work in particular
*/
PressureCellData pressureCellData;
} Chunk;

View File

@ -22,13 +22,13 @@ LIBRARY_API Chunk * chunk_create(){
* 8x8x8
* 16x16x16
*/
rVal->interestTree = (char **)calloc(1,sizeof(char *) * 6);
//allocating extra data for ghost cells even though we will not evaluate the ghost cells
rVal->interestTree[0] = (char *)calloc(3*3*3,sizeof(char));
rVal->interestTree[1] = (char *)calloc(4*4*4,sizeof(char));
rVal->interestTree[2] = (char *)calloc(6*6*6,sizeof(char));
rVal->interestTree[3] = (char *)calloc(10*10*10,sizeof(char));
rVal->interestTree[4] = (char *)calloc(18*18*18,sizeof(char));
// rVal->interestTree = (char **)calloc(1,sizeof(char *) * 6);
// //allocating extra data for ghost cells even though we will not evaluate the ghost cells
// rVal->interestTree[0] = (char *)calloc(3*3*3,sizeof(char));
// rVal->interestTree[1] = (char *)calloc(4*4*4,sizeof(char));
// rVal->interestTree[2] = (char *)calloc(6*6*6,sizeof(char));
// rVal->interestTree[3] = (char *)calloc(10*10*10,sizeof(char));
// rVal->interestTree[4] = (char *)calloc(18*18*18,sizeof(char));
return rVal;
}

View File

@ -96,52 +96,51 @@ LIBRARY_API void pressurecell_update_bounds(Environment * environment, Chunk * c
/**
* Updates the interest tree for this chunk
*/
LIBRARY_API void pressurecell_update_interest(Environment * environment, Chunk * chunk){
int level, x, y, z;
int dim;
char ** interestTree = chunk->interestTree;
float * densityArr = chunk->d[CENTER_LOC];
float * densitSrcArr = chunk->d0[CENTER_LOC];
// for(level = 0; level < CHUNK_MAX_INTEREST_LEVEL; level++){
// dim = pow(2,level);
// for(x = 0; x < dim; x++){
// for(y = 0; y < dim; y++){
// for(z = 0; z < dim; z++){
// if(
// densityArr[IX(x,y,z)] > 0 ||
// densityArr[IX(x+1,y,z)] > 0 ||
// densityArr[IX(x-1,y,z)] > 0 ||
// densityArr[IX(x,y+1,z)] > 0 ||
// densityArr[IX(x,y-1,z)] > 0 ||
// densityArr[IX(x,y,z+1)] > 0 ||
// densityArr[IX(x,y,z-1)] > 0
// ){
// LIBRARY_API void pressurecell_update_interest(Environment * environment, Chunk * chunk){
// int level, x, y, z;
// int dim;
// float * densityArr = chunk->d[CENTER_LOC];
// float * densitSrcArr = chunk->d0[CENTER_LOC];
// // for(level = 0; level < CHUNK_MAX_INTEREST_LEVEL; level++){
// // dim = pow(2,level);
// // for(x = 0; x < dim; x++){
// // for(y = 0; y < dim; y++){
// // for(z = 0; z < dim; z++){
// // if(
// // densityArr[IX(x,y,z)] > 0 ||
// // densityArr[IX(x+1,y,z)] > 0 ||
// // densityArr[IX(x-1,y,z)] > 0 ||
// // densityArr[IX(x,y+1,z)] > 0 ||
// // densityArr[IX(x,y-1,z)] > 0 ||
// // densityArr[IX(x,y,z+1)] > 0 ||
// // densityArr[IX(x,y,z-1)] > 0
// // ){
// }
// }
// }
// }
// }
for(x = 1; x < DIM-1; x++){
for(y = 1; y < DIM-1; y++){
for(z = 1; z < DIM-1; z++){
if(
densityArr[IX(x,y,z)] > MIN_FLUID_VALUE ||
densityArr[IX(x+1,y,z)] > MIN_FLUID_VALUE ||
densityArr[IX(x-1,y,z)] > MIN_FLUID_VALUE ||
densityArr[IX(x,y+1,z)] > MIN_FLUID_VALUE ||
densityArr[IX(x,y-1,z)] > MIN_FLUID_VALUE ||
densityArr[IX(x,y,z+1)] > MIN_FLUID_VALUE ||
densityArr[IX(x,y,z-1)] > MIN_FLUID_VALUE ||
densitSrcArr[IX(x,y,z)] > MIN_FLUID_VALUE
){
INTEREST(interestTree,0,x,y,z) = 1;
INTEREST(interestTree,1,x,y,z) = 1;
INTEREST(interestTree,2,x,y,z) = 1;
INTEREST(interestTree,3,x,y,z) = 1;
INTEREST(interestTree,4,x,y,z) = 1;
}
}
}
}
}
// // }
// // }
// // }
// // }
// // }
// for(x = 1; x < DIM-1; x++){
// for(y = 1; y < DIM-1; y++){
// for(z = 1; z < DIM-1; z++){
// if(
// densityArr[IX(x,y,z)] > MIN_FLUID_VALUE ||
// densityArr[IX(x+1,y,z)] > MIN_FLUID_VALUE ||
// densityArr[IX(x-1,y,z)] > MIN_FLUID_VALUE ||
// densityArr[IX(x,y+1,z)] > MIN_FLUID_VALUE ||
// densityArr[IX(x,y-1,z)] > MIN_FLUID_VALUE ||
// densityArr[IX(x,y,z+1)] > MIN_FLUID_VALUE ||
// densityArr[IX(x,y,z-1)] > MIN_FLUID_VALUE ||
// densitSrcArr[IX(x,y,z)] > MIN_FLUID_VALUE
// ){
// INTEREST(interestTree,0,x,y,z) = 1;
// INTEREST(interestTree,1,x,y,z) = 1;
// INTEREST(interestTree,2,x,y,z) = 1;
// INTEREST(interestTree,3,x,y,z) = 1;
// INTEREST(interestTree,4,x,y,z) = 1;
// }
// }
// }
// }
// }

View File

@ -1,6 +1,8 @@
#include "fluid/sim/pressurecell/normalization.h"
#include "fluid/queue/chunkmask.h"
#include "fluid/queue/chunk.h"
@ -9,21 +11,49 @@
* Calculates the expected density and pressure
*/
LIBRARY_API void fluid_pressurecell_calculate_expected_intake(Environment * env, Chunk * chunk){
int x, y, z;
double sum;
for(x = 1; x < DIM-1; x++){
for(y = 1; y < DIM-1; y++){
for(z = 1; z < DIM-1; z++){
sum = sum + chunk->d[CENTER_LOC][IX(x,y,z)] + chunk->d0[CENTER_LOC][IX(x,y,z)];
}
}
}
chunk->pressureCellData.densitySum = sum;
}
/**
* Calculates the ratio to normalize the chunk by
*/
LIBRARY_API void fluid_pressurecell_calculate_normalization_ratio(Environment * env, Chunk * chunk){
int x, y, z;
double sum;
for(x = 1; x < DIM-1; x++){
for(y = 1; y < DIM-1; y++){
for(z = 1; z < DIM-1; z++){
sum = sum + chunk->d[CENTER_LOC][IX(x,y,z)];
}
}
}
double expected = chunk->pressureCellData.densitySum;
double normalizationRatio = expected / sum;
chunk->pressureCellData.densitySum = normalizationRatio;
}
/**
* Normalizes the chunk
*/
LIBRARY_API void fluid_pressurecell_normalize_chunk(Environment * env, Chunk * chunk){
int x, y, z;
double ratio = chunk->pressureCellData.densitySum;
for(x = 1; x < DIM-1; x++){
for(y = 1; y < DIM-1; y++){
for(z = 1; z < DIM-1; z++){
chunk->d[CENTER_LOC][IX(x,y,z)] = chunk->d[CENTER_LOC][IX(x,y,z)] * ratio;
}
}
}
}

View File

@ -40,6 +40,7 @@ LIBRARY_API void fluid_pressurecell_simulate(
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
fluid_pressurecell_calculate_expected_intake(environment,currentChunk);
pressurecell_update_bounds(environment,currentChunk);
// pressurecell_update_interest(environment,currentChunk);
}
@ -120,6 +121,11 @@ LIBRARY_API void fluid_pressurecell_simulate(
//
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
fluid_pressurecell_calculate_normalization_ratio(environment,currentChunk);
}
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
fluid_pressurecell_normalize_chunk(environment,currentChunk);
fluid_pressurecell_clearArr(currentChunk->d0[CENTER_LOC]);
fluid_pressurecell_clearArr(currentChunk->u0[CENTER_LOC]);
fluid_pressurecell_clearArr(currentChunk->v0[CENTER_LOC]);