From 7dd7dcfc4dc8ffb5595db2cf08af6dfbe4810e3d Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 11 Dec 2024 21:17:15 -0500 Subject: [PATCH] convergence speed testing --- .../includes/fluid/sim/grid2/solver_consts.h | 2 +- .../c/fluid/sim/grid2/convergence_tests.c | 173 ++++++++++++++++++ 2 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 src/test/c/fluid/sim/grid2/convergence_tests.c diff --git a/src/main/c/includes/fluid/sim/grid2/solver_consts.h b/src/main/c/includes/fluid/sim/grid2/solver_consts.h index 013681b3..dd1d7cde 100644 --- a/src/main/c/includes/fluid/sim/grid2/solver_consts.h +++ b/src/main/c/includes/fluid/sim/grid2/solver_consts.h @@ -30,7 +30,7 @@ /** * The tolerance for convergence of the projection operator */ -#define FLUID_GRID2_PROJECTION_CONVERGENCE_TOLERANCE 0.01f +#define FLUID_GRID2_PROJECTION_CONVERGENCE_TOLERANCE 0.005f /** * Diffusion constant diff --git a/src/test/c/fluid/sim/grid2/convergence_tests.c b/src/test/c/fluid/sim/grid2/convergence_tests.c new file mode 100644 index 00000000..1a62066d --- /dev/null +++ b/src/test/c/fluid/sim/grid2/convergence_tests.c @@ -0,0 +1,173 @@ +#include + +#include "stb/stb_ds.h" + +#include "fluid/queue/boundsolver.h" +#include "fluid/queue/chunkmask.h" +#include "fluid/queue/chunk.h" +#include "fluid/env/environment.h" +#include "fluid/env/utilities.h" +#include "fluid/sim/grid2/density.h" +#include "fluid/sim/grid2/grid2.h" +#include "fluid/sim/grid2/solver_consts.h" +#include "fluid/sim/grid2/utilities.h" +#include "fluid/sim/grid2/velocity.h" +#include "math/ode/multigrid.h" +#include "../../../util/chunk_test_utils.h" +#include "../../../util/test.h" + + + + +/** + * Error margin for tests + */ +#define FLUID_GRID2_PROJECTION_ERROR_MARGIN 0.00001f + +/** + * Maximum convergence we want to see in any chunk + */ +#define FLUID_GRID2_CONVERGENCE_MAX_ITERATIONS 10 + + + +/** + * Testing full sim routine + */ +int fluid_sim_grid2_convergence_test1(){ + printf("fluid_sim_grid2_convergence_test1\n"); + int rVal = 0; + Environment * env = fluid_environment_create(); + Chunk ** queue = NULL; + queue = createChunkGrid(env,3,3,3); + int chunkCount = arrlen(queue); + + + + //setup chunk values + Chunk * currentChunk = queue[0]; + currentChunk->d[CENTER_LOC][IX(4,4,4)] = MAX_FLUID_VALUE; + currentChunk->u[CENTER_LOC][IX(4,4,4)] = MAX_FLUID_VALUE; + float beforeSum = chunk_queue_sum_density(queue); + + //actually simulate + int frameCount = 1; + for(int frame = 0; frame < frameCount; frame++){ + //sim + fluid_grid2_simulate(chunkCount,queue,env,FLUID_GRID2_SIM_STEP); + } + + //test results + for(int i = 0; i < chunkCount; i++){ + Chunk * chunk = queue[i]; + if(chunk->projectionIterations > FLUID_GRID2_CONVERGENCE_MAX_ITERATIONS || chunk->projectionResidual > FLUID_GRID2_PROJECTION_CONVERGENCE_TOLERANCE){ + printf("Chunk took too many iterations or had too high of a residual! (frames: %d, chunk count: %d) \n", frameCount, chunkCount); + printf("Residual: %f \n",chunk->projectionResidual); + printf("Iterations: %d \n",chunk->projectionIterations); + printf("\n"); + rVal++; + break; + } + } + + return rVal; +} + +/** + * Testing full sim routine + */ +int fluid_sim_grid2_convergence_test2(){ + printf("fluid_sim_grid2_convergence_test2\n"); + int rVal = 0; + Environment * env = fluid_environment_create(); + Chunk ** queue = NULL; + queue = createChunkGrid(env,3,3,3); + int chunkCount = arrlen(queue); + + + + //setup chunk values + Chunk * currentChunk = queue[0]; + currentChunk->d[CENTER_LOC][IX(4,4,4)] = MAX_FLUID_VALUE; + currentChunk->u[CENTER_LOC][IX(4,4,4)] = MAX_FLUID_VALUE; + float beforeSum = chunk_queue_sum_density(queue); + + //actually simulate + int frameCount = 50; + for(int frame = 0; frame < frameCount; frame++){ + //sim + fluid_grid2_simulate(chunkCount,queue,env,FLUID_GRID2_SIM_STEP); + } + + //test results + for(int i = 0; i < chunkCount; i++){ + Chunk * chunk = queue[i]; + if(chunk->projectionIterations > FLUID_GRID2_CONVERGENCE_MAX_ITERATIONS || chunk->projectionResidual > FLUID_GRID2_PROJECTION_CONVERGENCE_TOLERANCE){ + printf("Chunk took too many iterations or had too high of a residual! (frames: %d, chunk count: %d) \n", frameCount, chunkCount); + printf("Residual: %f \n",chunk->projectionResidual); + printf("Iterations: %d \n",chunk->projectionIterations); + printf("\n"); + rVal++; + break; + } + } + + return rVal; +} + +/** + * Testing full sim routine + */ +int fluid_sim_grid2_convergence_test3(){ + printf("fluid_sim_grid2_convergence_test3\n"); + int rVal = 0; + Environment * env = fluid_environment_create(); + Chunk ** queue = NULL; + queue = createChunkGrid(env,5,5,5); + int chunkCount = arrlen(queue); + + + + //setup chunk values + Chunk * currentChunk = queue[0]; + chunk_fill_real(queue[13]->d[CENTER_LOC],MAX_FLUID_VALUE); + chunk_fill_real(queue[13]->u[CENTER_LOC],MAX_FLUID_VALUE); + float beforeSum = chunk_queue_sum_density(queue); + + //actually simulate + int frameCount = 50; + for(int frame = 0; frame < frameCount; frame++){ + //sim + fluid_grid2_simulate(chunkCount,queue,env,FLUID_GRID2_SIM_STEP); + } + + //test results + for(int i = 0; i < chunkCount; i++){ + Chunk * chunk = queue[i]; + if(chunk->projectionIterations > FLUID_GRID2_CONVERGENCE_MAX_ITERATIONS || chunk->projectionResidual > FLUID_GRID2_PROJECTION_CONVERGENCE_TOLERANCE){ + printf("Chunk took too many iterations or had too high of a residual! (frames: %d, chunk count: %d) \n", frameCount, chunkCount); + printf("Residual: %f \n",chunk->projectionResidual); + printf("Iterations: %d \n",chunk->projectionIterations); + printf("\n"); + rVal++; + break; + } + } + + return rVal; +} + +/** + * Testing full sim routines + */ +int fluid_sim_grid2_convergence_tests(){ + int rVal = 0; + + fluid_grid2_allocate_arrays(); + + rVal += fluid_sim_grid2_convergence_test1(); + rVal += fluid_sim_grid2_convergence_test2(); + rVal += fluid_sim_grid2_convergence_test3(); + + return rVal; +} \ No newline at end of file