cellular determinism verification

This commit is contained in:
austin 2024-12-07 16:24:53 -05:00
parent 0091f94daf
commit 6ee0a1b2c5
5 changed files with 57 additions and 5 deletions

View File

@ -1268,6 +1268,8 @@ Cellular transfer behavior work
Native math utils Native math utils
Frame tracking on native side Frame tracking on native side
Fix memory leak in client fluid data chunks Fix memory leak in client fluid data chunks
Work on cellular sim determinism
More cellular determinism verification
# TODO # TODO

View File

@ -8,7 +8,7 @@
static inline void fluid_solve_bounds_checker(float ** arrays, int fillVal){ static inline void fluid_solve_bounds_checker(float ** arrays, float fillVal){
int i, j; int i, j;
int neighborIndex; int neighborIndex;
//x+ face //x+ face

View File

@ -204,6 +204,55 @@ int fluid_sim_cellular_stability_test1(){
return rVal; return rVal;
} }
int fluid_sim_cellular_stability_test2(){
int rVal = 0;
printf("fluid_sim_cellular_stability_test2\n");
Environment * env = fluid_environment_create();
int chunkCount = 27;
Chunk ** queue = NULL;
for(int i = 0; i < chunkCount; i++){
arrput(queue,chunk_create(
fluid_sim_cellular_cellular_tests_kernelx[i],
fluid_sim_cellular_cellular_tests_kernely[i],
fluid_sim_cellular_cellular_tests_kernelz[i]
));
}
//link neighbors
chunk_link_neighbors(queue);
//fill them with values
for(int i = 0; i < chunkCount; i++){
chunk_fill(queue[i],0);
}
//fill the 13th chunk
chunk_fill(queue[13],CELLULAR_TEST_PLACE_VAL);
//check sum beforehand
float originalSum = chunk_queue_sum(queue);
//dispatch and simulate
int frameCount = 50;
for(int i = 0; i < frameCount; i++){
fluid_solve_bounds(chunkCount,queue,env);
fluid_dispatch(chunkCount,queue,env);
fluid_simulate(env);
env->state.frame++;
}
//check sum beforehand
float afterSum = chunk_queue_sum(queue);
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
printf("\n");
return rVal;
}
int fluid_sim_cellular_cellular_tests(int argc, char **argv){ int fluid_sim_cellular_cellular_tests(int argc, char **argv){
int rVal = 0; int rVal = 0;
@ -211,6 +260,7 @@ int fluid_sim_cellular_cellular_tests(int argc, char **argv){
rVal += fluid_sim_cellular_bounds_test1(); rVal += fluid_sim_cellular_bounds_test1();
rVal += fluid_sim_cellular_bounds_test2(); rVal += fluid_sim_cellular_bounds_test2();
rVal += fluid_sim_cellular_stability_test1(); rVal += fluid_sim_cellular_stability_test1();
rVal += fluid_sim_cellular_stability_test2();
return rVal; return rVal;
} }

View File

@ -81,7 +81,7 @@ void chunk_free_queue(Chunk ** chunks){
* @param chunk The chunk to fill * @param chunk The chunk to fill
* @param val The value to fill * @param val The value to fill
*/ */
void chunk_fill(Chunk * chunk, int val){ void chunk_fill(Chunk * chunk, float val){
for(int i = 0; i < DIM*DIM*DIM; i++){ for(int i = 0; i < DIM*DIM*DIM; i++){
chunk->d[CENTER_LOC][i] = val; chunk->d[CENTER_LOC][i] = val;
chunk->d0[CENTER_LOC][i] = val; chunk->d0[CENTER_LOC][i] = val;
@ -219,8 +219,8 @@ void chunk_link_neighbors(Chunk ** chunks){
*/ */
float chunk_queue_sum(Chunk ** chunks){ float chunk_queue_sum(Chunk ** chunks){
float sum = 0; float sum = 0;
int num = arrlen(chunks); int chunkCount = arrlen(chunks);
for(int i = 0; i < num; i++){ for(int i = 0; i < chunkCount; i++){
Chunk * current = chunks[i]; Chunk * current = chunks[i];
for(int x = 1; x < DIM - 2; x++){ for(int x = 1; x < DIM - 2; x++){
for(int y = 1; y < DIM - 2; y++){ for(int y = 1; y < DIM - 2; y++){

View File

@ -76,7 +76,7 @@ Chunk ** chunk_create_queue(int size);
* @param chunk The chunk to fill * @param chunk The chunk to fill
* @param val The value to fill * @param val The value to fill
*/ */
void chunk_fill(Chunk * chunk, int val); void chunk_fill(Chunk * chunk, float val);
/** /**
* Frees a chunk queue * Frees a chunk queue