add speed test for grid2
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-12-11 21:03:29 -05:00
parent ecbc0b6201
commit c435126513

View File

@ -1,3 +1,22 @@
#include <math.h>
#include <sys/time.h>
#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"
#define TARGET_SIM_RADIUS 3.0
@ -34,12 +53,185 @@
*/
#define TIME_PER_CHUNK (TOTAL_ALLOWED_TIME_IN_MILLI_SECONDS / (TARGET_CHUNKS / SIM_THREADS))
/**
* Error margin for tests
*/
#define FLUID_GRID2_PROJECTION_ERROR_MARGIN 0.00001f
/**
* Used for storing timings
*/
struct timeval tv;
/**
* Testing full sim routine
*/
int fluid_sim_grid2_speed_test1(){
printf("fluid_sim_grid2_speed_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;
double frameTimeAccumulator = 0;
for(int frame = 0; frame < frameCount; frame++){
//get time at start
gettimeofday(&tv,NULL);
double start = 1000000.0 * tv.tv_sec + tv.tv_usec;
//sim
fluid_grid2_simulate(chunkCount,queue,env,FLUID_GRID2_SIM_STEP);
//get time at end
gettimeofday(&tv,NULL);
double end = 1000000.0 * tv.tv_sec + tv.tv_usec;
frameTimeAccumulator = frameTimeAccumulator + (end - start);
}
//test the result
double avgPerChunk = frameTimeAccumulator / (float)frameCount / (float)chunkCount;
double perMilli = avgPerChunk / 1000.0f;
if(avgPerChunk > TIME_PER_CHUNK || 1){
printf("Chunk simulation failing desired speed! (frames: %d, chunk count: %d) \n", frameCount, chunkCount);
printf("Accumulator Value: %lf \n",frameTimeAccumulator);
printf("Frame time per chunk (micro): %lf \n",avgPerChunk);
printf("Frame time per chunk (milli): %lf \n",perMilli);
printf("Target time (milli): %f \n",TIME_PER_CHUNK);
printf("\n");
rVal++;
}
return rVal;
}
/**
* Testing full sim routine
*/
int fluid_sim_grid2_speed_test2(){
printf("fluid_sim_grid2_speed_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;
double frameTimeAccumulator = 0;
for(int frame = 0; frame < frameCount; frame++){
//get time at start
gettimeofday(&tv,NULL);
double start = 1000000.0 * tv.tv_sec + tv.tv_usec;
//sim
fluid_grid2_simulate(chunkCount,queue,env,FLUID_GRID2_SIM_STEP);
//get time at end
gettimeofday(&tv,NULL);
double end = 1000000.0 * tv.tv_sec + tv.tv_usec;
frameTimeAccumulator = frameTimeAccumulator + (end - start);
}
//test the result
double avgPerChunk = frameTimeAccumulator / (float)frameCount / (float)chunkCount;
double perMilli = avgPerChunk / 1000.0f;
if(avgPerChunk > TIME_PER_CHUNK){
printf("Chunk simulation failing desired speed! (frames: %d, chunk count: %d) \n", frameCount, chunkCount);
printf("Accumulator Value: %lf \n",frameTimeAccumulator);
printf("Frame time per chunk (micro): %lf \n",avgPerChunk);
printf("Frame time per chunk (milli): %lf \n",perMilli);
printf("Target time (milli): %f \n",TIME_PER_CHUNK);
printf("\n");
rVal++;
}
return rVal;
}
/**
* Testing full sim routine
*/
int fluid_sim_grid2_speed_test3(){
printf("fluid_sim_grid2_speed_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;
double frameTimeAccumulator = 0;
for(int frame = 0; frame < frameCount; frame++){
//get time at start
gettimeofday(&tv,NULL);
double start = 1000000.0 * tv.tv_sec + tv.tv_usec;
//sim
fluid_grid2_simulate(chunkCount,queue,env,FLUID_GRID2_SIM_STEP);
//get time at end
gettimeofday(&tv,NULL);
double end = 1000000.0 * tv.tv_sec + tv.tv_usec;
frameTimeAccumulator = frameTimeAccumulator + (end - start);
}
//test the result
double avgPerChunk = frameTimeAccumulator / (float)frameCount / (float)chunkCount;
double perMilli = avgPerChunk / 1000.0f;
if(avgPerChunk > TIME_PER_CHUNK){
printf("Chunk simulation failing desired speed! (frames: %d, chunk count: %d) \n", frameCount, chunkCount);
printf("Accumulator Value: %lf \n",frameTimeAccumulator);
printf("Frame time per chunk (micro): %lf \n",avgPerChunk);
printf("Frame time per chunk (milli): %lf \n",perMilli);
printf("Target time (milli): %f \n",TIME_PER_CHUNK);
printf("\n");
rVal++;
}
return rVal;
}
/**
* Testing full sim routines
*/
int fluid_sim_grid2_speed_tests(){
int rVal = 0;
int itmePErChunk = TIME_PER_CHUNK;
fluid_grid2_allocate_arrays();
// rVal += fluid_sim_grid2_speed_test1();
// rVal += fluid_sim_grid2_speed_test2();
// rVal += fluid_sim_grid2_speed_test3();
return rVal;
}