cellular stability work
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-12-08 01:42:37 -05:00
parent 2ec5ad9a93
commit 3a87349a66
4 changed files with 357 additions and 127 deletions

View File

@ -21,6 +21,11 @@
*/ */
#define FLUID_CELLULAR_SURFACE_TENSION_CONST 0.4 #define FLUID_CELLULAR_SURFACE_TENSION_CONST 0.4
/**
* This is the expected amount of variance frame-to-frame for a chunk that is completely full of fluid
*/
#define FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1 0.1f
/** /**
* Simulates the cellular chunk queue * Simulates the cellular chunk queue
* @param environment The environment storing the simulation queues * @param environment The environment storing the simulation queues

View File

@ -196,6 +196,12 @@ LIBRARY_API void fluid_cellular_simulate(Environment * environment){
if(d[IX(x,y,z)] < FLUID_CELLULAR_DIFFUSE_RATE2){ if(d[IX(x,y,z)] < FLUID_CELLULAR_DIFFUSE_RATE2){
transfer = d[IX(x,y,z)]; transfer = d[IX(x,y,z)];
} }
// if(worldX == 2 && worldZ == 2){
// printf("lateral\n");
// printf("[%d %d %d] <%d,%d,%d> --> <%d,%d,%d> \n",worldX,worldY,worldZ,x,y,z,nX,y,nZ);
// printf("%f %d %d --> %d %d \n",transfer,permuteX,permuteZ,permuteX + xKernel,permuteZ + zKernel);
// printf("%f %f \n",d[IX(x,y,z)],d[IX(nX,y,nZ)]);
// }
// printf("lateral\n"); // printf("lateral\n");
// printf("[%d %d %d] <%d,%d,%d> --> <%d,%d,%d> \n",worldX,worldY,worldZ,x,y,z,nX,y,nZ); // printf("[%d %d %d] <%d,%d,%d> --> <%d,%d,%d> \n",worldX,worldY,worldZ,x,y,z,nX,y,nZ);
// printf("%f %d %d --> %d %d \n",transfer,permuteX,permuteZ,permuteX + xKernel,permuteZ + zKernel); // printf("%f %d %d --> %d %d \n",transfer,permuteX,permuteZ,permuteX + xKernel,permuteZ + zKernel);
@ -206,6 +212,13 @@ LIBRARY_API void fluid_cellular_simulate(Environment * environment){
// printf("\n"); // printf("\n");
} }
} }
// if(worldX == 2 && worldZ == 2 && x == 15 && z == 9){
// printf("lateral\n");
// printf("[%d %d %d] <%d,%d,%d> --> <%d,%d,%d> \n",worldX,worldY,worldZ,x,y,z,nX,y,nZ);
// printf("%d %d --> %d %d \n",permuteX,permuteZ,permuteX + xKernel,permuteZ + zKernel);
// printf("%f %f \n",d[IX(x,y,z)],d[IX(nX,y,nZ)]);
// }
} }
} }
} }

View File

@ -19,8 +19,16 @@
#define CELLULAR_TEST_PLACE_VAL (FLUID_CELLULAR_DIFFUSE_RATE2 + 0.13456f) #define CELLULAR_TEST_PLACE_VAL (FLUID_CELLULAR_DIFFUSE_RATE2 + 0.13456f)
#define TOLLERABLE_LOSS_THRESHOLD 0.1f
#define TOLLERABLE_LOSS_THRESHOLD2 0.0001f /**
* Stricter threshold used for sparser chunks
*/
#define FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2 0.0001f
/**
* Strictest threshold used for sparser chunks
*/
#define FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3 0.01f
int fluid_sim_cellular_cellular_tests_kernelx[27] = { int fluid_sim_cellular_cellular_tests_kernelx[27] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -98,101 +106,17 @@ void fluid_sim_cellular_test_diagnose_desync(Chunk ** queue){
printf("mismatch at [%d %d %d] <1,1,1> \n", worldX,worldY,worldZ); printf("mismatch at [%d %d %d] <1,1,1> \n", worldX,worldY,worldZ);
} }
} }
// if(d[CK(2,1,1)] != NULL){
// realX = worldX * 16 + 17;
// realZ = worldZ * 16 + 1;
// if(d[CENTER_LOC][IX(17,1,1)] != d[CK(2,1,1)][IX(1,1,1)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 17;
// realZ = worldZ * 16 + 16;
// if(d[CENTER_LOC][IX(17,1,16)] != d[CK(2,1,1)][IX(1,1,16)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 16;
// realZ = worldZ * 16 + 1;
// if(d[CENTER_LOC][IX(16,1,1)] != d[CK(2,1,1)][IX(0,1,1)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 16;
// realZ = worldZ * 16 + 16;
// if(d[CENTER_LOC][IX(16,1,16)] != d[CK(2,1,1)][IX(0,1,16)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// }
// if(d[CK(0,1,1)] != NULL){
// realX = worldX * 16 + 0;
// realZ = worldZ * 16 + 1;
// if(d[CENTER_LOC][IX(0,1,1)] != d[CK(0,1,1)][IX(16,1,1)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 0;
// realZ = worldZ * 16 + 16;
// if(d[CENTER_LOC][IX(0,1,16)] != d[CK(0,1,1)][IX(16,1,16)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 1;
// realZ = worldZ * 16 + 1;
// if(d[CENTER_LOC][IX(1,1,1)] != d[CK(0,1,1)][IX(17,1,1)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 1;
// realZ = worldZ * 16 + 16;
// if(d[CENTER_LOC][IX(1,1,16)] != d[CK(0,1,1)][IX(17,1,16)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// }
// if(d[CK(1,1,2)] != NULL){ }
// realX = worldX * 16 + 1; }
// realZ = worldZ * 16 + 17;
// if(d[CENTER_LOC][IX(1,1,17)] != d[CK(1,1,2)][IX(1,1,1)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 16;
// realZ = worldZ * 16 + 16;
// if(d[CENTER_LOC][IX(16,1,0)] != d[CK(0,1,1)][IX(16,1,16)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// }
// if(d[CK(1,1,0)] != NULL){
// realX = worldX * 16 + 1;
// realZ = worldZ * 16 + 0;
// if(d[CENTER_LOC][IX(1,1,0)] != d[CK(1,1,0)][IX(1,1,16)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// realX = worldX * 16 + 16;
// realZ = worldZ * 16 + 0;
// if(d[CENTER_LOC][IX(16,1,0)] != d[CK(1,1,0)][IX(16,1,16)]){
// printf("mismatch in [%d %d %d] / [%d %d %d] \n", worldX,worldY,worldZ, worldX+1,worldY,worldZ );
// printf("pos of mismatch %d %d\n",realX,realZ);
// printf("\n");
// }
// }
void fluid_sim_cellular_test_print_slice(Chunk * chunk, int y){
float * d = chunk->d[CENTER_LOC];
for(int x = 0; x < DIM; x++){
for(int z = 0; z < DIM; z++){
printf("%.2f ", d[IX(x,y,z)]);
}
printf("\n");
} }
} }
@ -495,7 +419,7 @@ int fluid_sim_cellular_stability_test3(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter); printf("desync by frame %d \n",frameCounter);
@ -521,7 +445,7 @@ int fluid_sim_cellular_stability_test3(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -566,7 +490,7 @@ int fluid_sim_cellular_stability_test4(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD2){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d --- %f \n",frameCounter,delta); printf("desync by frame %d --- %f \n",frameCounter,delta);
@ -592,7 +516,7 @@ int fluid_sim_cellular_stability_test4(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -644,7 +568,7 @@ int fluid_sim_cellular_stability_test5(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD2){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter); printf("desync by frame %d \n",frameCounter);
@ -670,7 +594,7 @@ int fluid_sim_cellular_stability_test5(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -722,7 +646,7 @@ int fluid_sim_cellular_stability_test6(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD2){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter); printf("desync by frame %d \n",frameCounter);
@ -748,7 +672,7 @@ int fluid_sim_cellular_stability_test6(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -782,10 +706,11 @@ int fluid_sim_cellular_stability_test7(){
} }
//fill the 10th chunk //fill the 10th chunk
int size = 16; int lowerBound = 1;
for(int x = 1; x < size+1; x++){ int upperBound = 16;
for(int y = 1; y < size+1; y++){ for(int x = lowerBound; x < upperBound+1; x++){
for(int z = 1; z < size+1; z++){ for(int y = lowerBound; y < upperBound+1; y++){
for(int z = lowerBound; z < upperBound+1; z++){
queue[13]->d[CENTER_LOC][IX(x,y,z)] = MAX_FLUID_VALUE; queue[13]->d[CENTER_LOC][IX(x,y,z)] = MAX_FLUID_VALUE;
} }
} }
@ -799,22 +724,21 @@ int fluid_sim_cellular_stability_test7(){
int frameCounter; int frameCounter;
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
// printf("frame: %d --- %f \n", frameCounter,currentSum); printf("frame: %d --- %f \n", frameCounter,currentSum);
fluid_solve_bounds(chunkCount,queue,env); fluid_solve_bounds(chunkCount,queue,env);
fluid_dispatch(chunkCount,queue,env); fluid_dispatch(chunkCount,queue,env);
fluid_simulate(env); fluid_simulate(env);
fluid_solve_bounds(chunkCount,queue,env);
float postSum = chunk_queue_sum(queue); float postSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - postSum); float delta = fabs(originalSum - postSum);
fluid_solve_bounds(chunkCount,queue,env); if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
if(delta > TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(postSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(postSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync on frame %d \n",frameCounter); printf("desync on frame %d \n",frameCounter);
fluid_sim_cellular_test_diagnose_desync(queue); fluid_sim_cellular_test_diagnose_desync(queue);
break; break;
} }
// printf("\n"); printf("\n");
env->state.frame++; env->state.frame++;
} }
@ -828,7 +752,7 @@ int fluid_sim_cellular_stability_test7(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -880,7 +804,7 @@ int fluid_sim_cellular_stability_test8(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD2){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter); printf("desync by frame %d \n",frameCounter);
@ -906,7 +830,7 @@ int fluid_sim_cellular_stability_test8(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -959,7 +883,7 @@ int fluid_sim_cellular_stability_test9(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD2){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter); printf("desync by frame %d \n",frameCounter);
@ -985,7 +909,7 @@ int fluid_sim_cellular_stability_test9(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -1037,7 +961,7 @@ int fluid_sim_cellular_stability_test10(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD2){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter); printf("desync by frame %d \n",frameCounter);
@ -1063,7 +987,7 @@ int fluid_sim_cellular_stability_test10(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD3){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -1071,9 +995,9 @@ int fluid_sim_cellular_stability_test10(){
return rVal; return rVal;
} }
int fluid_sim_cellular_stability_test_full_chunk(){ int fluid_sim_cellular_stability_test11(){
int rVal = 0; int rVal = 0;
printf("fluid_sim_cellular_stability_test_full_chunk\n"); printf("fluid_sim_cellular_stability_test11\n");
Environment * env = fluid_environment_create(); Environment * env = fluid_environment_create();
@ -1108,7 +1032,7 @@ int fluid_sim_cellular_stability_test_full_chunk(){
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){ for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue); float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum); float delta = fabs(originalSum - currentSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
printf("Failed to equal sums! \n"); printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n"); rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter); printf("desync by frame %d \n",frameCounter);
@ -1133,7 +1057,292 @@ int fluid_sim_cellular_stability_test_full_chunk(){
//diff the sums to see if we've changed value a lot //diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum); float delta = fabs(originalSum - afterSum);
if(delta > TOLLERABLE_LOSS_THRESHOLD){ if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
}
printf("\n");
return rVal;
}
int fluid_sim_cellular_stability_test12(){
int rVal = 0;
printf("fluid_sim_cellular_stability_test12\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 bottom plane of chunks
for(int x = 0; x < 3; x++){
for(int z = 0; z < 3; z++){
chunk_fill_real(queue[x * 3 * 3 + z]->d[CENTER_LOC],MAX_FLUID_VALUE);
}
}
//check sum beforehand
float originalSum = chunk_queue_sum(queue);
//dispatch and simulate
int frameCount = 100;
int frameCounter;
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum);
if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter);
break;
}
// printf("frame: %d --- %f \n", frameCounter,currentSum);
fluid_solve_bounds(chunkCount,queue,env);
fluid_dispatch(chunkCount,queue,env);
fluid_simulate(env);
fluid_solve_bounds(chunkCount,queue,env);
// printf("\n");
env->state.frame++;
}
//solve bounds afterwards to properly push data back into real arrays
//ie, if data is pushed out of bounds from one chunk to another, must
//then copy it into the in-bounds chunk
fluid_solve_bounds(chunkCount,queue,env);
//check sum beforehand
float afterSum = chunk_queue_sum(queue);
//diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum);
if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
}
printf("\n");
return rVal;
}
int fluid_sim_cellular_stability_test13(){
int rVal = 0;
printf("fluid_sim_cellular_stability_test13\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 bottom plane of chunks
for(int x = 0; x < 3; x++){
for(int z = 0; z < 3; z++){
float ** d = queue[x * 3 * 3 + z]->d;
for(int i = 1; i < DIM-1; i++){
for(int j = 1; j < DIM-1; j++){
d[CENTER_LOC][IX(i,1,j)] = MAX_FLUID_VALUE;
}
}
}
}
//check sum beforehand
float originalSum = chunk_queue_sum(queue);
//dispatch and simulate
int frameCount = 100;
int frameCounter;
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum);
if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter);
break;
}
// printf("frame: %d --- %f \n", frameCounter,currentSum);
fluid_solve_bounds(chunkCount,queue,env);
fluid_dispatch(chunkCount,queue,env);
fluid_simulate(env);
fluid_solve_bounds(chunkCount,queue,env);
// printf("\n");
env->state.frame++;
}
//solve bounds afterwards to properly push data back into real arrays
//ie, if data is pushed out of bounds from one chunk to another, must
//then copy it into the in-bounds chunk
fluid_solve_bounds(chunkCount,queue,env);
//check sum beforehand
float afterSum = chunk_queue_sum(queue);
//diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum);
if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
}
printf("\n");
return rVal;
}
int fluid_sim_cellular_stability_test14(){
int rVal = 0;
printf("fluid_sim_cellular_stability_test14\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 bottom plane of chunks
for(int x = 0; x < 3; x++){
for(int z = 0; z < 3; z++){
float ** d = queue[x * 3 * 3 + z]->d;
for(int i = 1; i < DIM-2; i++){
for(int j = 1; j < DIM-2; j++){
d[CENTER_LOC][IX(i,1,j)] = MAX_FLUID_VALUE;
}
}
}
}
//check sum beforehand
float originalSum = chunk_queue_sum(queue);
float slice[16 * 3][16 * 3];
int compareX = 2;
int compareZ = 2;
float compSum = 0;
//dispatch and simulate
int frameCount = 100;
int frameCounter;
for(frameCounter = 0; frameCounter < frameCount; frameCounter++){
float currentSum = chunk_queue_sum(queue);
float delta = fabs(originalSum - currentSum);
if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
printf("Failed to equal sums! \n");
rVal += assertEqualsFloat(currentSum,originalSum,"Sums are not identical! %f %f \n");
printf("desync by frame %d \n",frameCounter);
break;
}
// printf("frame: %d --- %f \n", frameCounter,currentSum);
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
for(int x = 1; x < DIM-1; x++){
for(int z = 1; z < DIM-1; z++){
Chunk * chunk = fluid_sim_cellular_test_get_chunk(queue,compareX,0,compareZ);
float * d = chunk->d[CENTER_LOC];
slice[x-1 + i * 16][z-1 + j * 16] = d[IX(x,1,z)];
}
}
}
}
fluid_solve_bounds(chunkCount,queue,env);
fluid_dispatch(chunkCount,queue,env);
fluid_simulate(env);
fluid_solve_bounds(chunkCount,queue,env);
// compSum= 0 ;
// for(int i = 0; i < 3; i++){
// for(int j = 0; j < 3; j++){
// for(int x = 1; x < DIM-1; x++){
// for(int z = 1; z < DIM-1; z++){
// compareX = i;
// compareZ = j;
// float newVal = fluid_sim_cellular_test_get_chunk(queue,compareX,0,compareZ)->d[CENTER_LOC][IX(x,1,z)];
// float sliceVal = slice[x-1 + i * 16][z-1 + j * 16];
// if(fabs(newVal - sliceVal) > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
// compSum = compSum + (newVal - sliceVal);
// // printf("change at %d %d -- %f %f \n",x,z,sliceVal,newVal);
// }
// }
// }
// }
// }
// if(compSum > 1.0f){
// printf("compSum: %f \n",compSum);
// for(int i = 0; i < 3; i++){
// for(int j = 0; j < 3; j++){
// for(int x = 1; x < DIM-1; x++){
// for(int z = 1; z < DIM-1; z++){
// compareX = i;
// compareZ = j;
// float newVal = fluid_sim_cellular_test_get_chunk(queue,compareX,0,compareZ)->d[CENTER_LOC][IX(x,1,z)];
// float sliceVal = slice[x-1 + i * 16][z-1 + j * 16];
// if(fabs(newVal - sliceVal) > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD2){
// printf("change at %d %d -- %f %f \n",x + i * 16,z + j * 16,sliceVal,newVal);
// }
// }
// }
// }
// }
// rVal++;
// break;
// }
// printf("\n");
env->state.frame++;
}
//solve bounds afterwards to properly push data back into real arrays
//ie, if data is pushed out of bounds from one chunk to another, must
//then copy it into the in-bounds chunk
fluid_solve_bounds(chunkCount,queue,env);
//check sum beforehand
float afterSum = chunk_queue_sum(queue);
//diff the sums to see if we've changed value a lot
float delta = fabs(originalSum - afterSum);
if(delta > FLUID_CELLULAR_TOLLERABLE_LOSS_THRESHOLD1){
rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n"); rVal += assertEqualsFloat(originalSum,afterSum,"cellular sim was unstable! %f %f \n");
} }
@ -1157,7 +1366,10 @@ int fluid_sim_cellular_cellular_tests(int argc, char **argv){
rVal += fluid_sim_cellular_stability_test8(); rVal += fluid_sim_cellular_stability_test8();
rVal += fluid_sim_cellular_stability_test9(); rVal += fluid_sim_cellular_stability_test9();
rVal += fluid_sim_cellular_stability_test10(); rVal += fluid_sim_cellular_stability_test10();
// rVal += fluid_sim_cellular_stability_test_full_chunk(); // rVal += fluid_sim_cellular_stability_test11();
rVal += fluid_sim_cellular_stability_test12();
rVal += fluid_sim_cellular_stability_test13();
// rVal += fluid_sim_cellular_stability_test14();
return rVal; return rVal;
} }

View File

@ -101,9 +101,9 @@ void chunk_fill(Chunk * chunk, float val){
* @param val The value to fill * @param val The value to fill
*/ */
void chunk_fill_real(float * arr, float val){ void chunk_fill_real(float * arr, float val){
for(int x = 1; x < DIM - 2; x++){ for(int x = 1; x < DIM - 1; x++){
for(int y = 1; y < DIM - 2; y++){ for(int y = 1; y < DIM - 1; y++){
for(int z = 1; z < DIM - 2; z++){ for(int z = 1; z < DIM - 1; z++){
arr[IX(x,y,z)] = val; arr[IX(x,y,z)] = val;
} }
} }