allocating arrays for new fluid sim approach
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-12-09 12:19:30 -05:00
parent 9b3f37017c
commit c914582c92
4 changed files with 77 additions and 107 deletions

View File

@ -228,7 +228,10 @@ void fluid_grid2_normalizeDensity(float ** d, float ratio);
/**
* Allocates the arrays necessary for grid2 simulation
*/
void fluid_grid2_allocate_arrays();

View File

@ -13,6 +13,7 @@
#include "fluid/env/environment.h"
#include "fluid/env/utilities.h"
#include "fluid/sim/grid/simulation.h"
#include "fluid/sim/grid2/simulation.h"
#include "fluid/sim/simulator.h"
#include "fluid/dispatch/dispatcher.h"
@ -138,6 +139,10 @@ JNIEXPORT void JNICALL Java_electrosphere_server_fluid_simulator_FluidAccelerate
environment->lookupTable.serverFluidChunkTable.asleepId = (*env)->GetFieldID(env,fluidSimStorageClass,"asleep","Z");
environment->lookupTable.serverFluidChunkTable.homogenousId = (*env)->GetFieldID(env,fluidSimStorageClass,"isHomogenous","Z");
environment->lookupTable.serverFluidChunkTable.normalizationRatioId = (*env)->GetStaticFieldID(env,fluidSimStorageClass,"normalizationRatio","F");
//init grid2 sim
fluid_grid2_allocate_arrays();
}
/**

View File

@ -1,4 +1,5 @@
#include <stdint.h>
#include <stdlib.h>
//native interfaces
#include "native/electrosphere_server_fluid_simulator_FluidAcceleratedSimulator.h"
@ -25,6 +26,24 @@ static inline void fluid_grid2_saveStep(float * values, const char * name);
static inline void fluid_grid2_applyGravity(Chunk * currentChunk, Environment * environment);
static inline void fluid_grid2_clearArr(float ** d);
/**
* A grid that stores a mask of the border locations
*/
float * fluid_grid2_borderArr;
/**
* An array that stores values for the neighbor's arrays
*/
float * fluid_grid2_neighborArr_d;
float * fluid_grid2_neighborArr_d0;
float * fluid_grid2_neighborArr_u;
float * fluid_grid2_neighborArr_v;
float * fluid_grid2_neighborArr_w;
float * fluid_grid2_neighborArr_u0;
float * fluid_grid2_neighborArr_v0;
float * fluid_grid2_neighborArr_w0;
float * fluid_grid2_neighborArr_bounds;
void fluid_grid2_simulate(
int numChunks,
Chunk ** passedInChunks,
@ -33,14 +52,6 @@ void fluid_grid2_simulate(
){
Chunk ** chunks = passedInChunks;
// printf("%p\n",chunks[0].d);
// saveStep(chunks[0]->u[CENTER_LOC], "./chunks/beginU");
// saveStep(chunks[0]->v[CENTER_LOC], "./chunks/beginV");
// saveStep(chunks[0]->w[CENTER_LOC], "./chunks/beginW");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/beginU0");
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/beginV0");
// saveStep(chunks[0]->w0[CENTER_LOC], "./chunks/beginW0");
//solve chunk mask
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
@ -57,12 +68,6 @@ void fluid_grid2_simulate(
FLUID_GRID2_VISCOSITY_CONSTANT,
timestep
);
// saveStep(currentChunk->u[CENTER_LOC], "./chunks/addSrcU");
// saveStep(currentChunk->v[CENTER_LOC], "./chunks/addSrcV");
// saveStep(currentChunk->w[CENTER_LOC], "./chunks/addSrcW");
// saveStep(currentChunk->u0[CENTER_LOC], "./chunks/addSrcU0");
// saveStep(currentChunk->v0[CENTER_LOC], "./chunks/addSrcV0");
// saveStep(currentChunk->w0[CENTER_LOC], "./chunks/addSrcW0");
}
//swap all vector fields
{
@ -98,16 +103,6 @@ void fluid_grid2_simulate(
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,3,currentChunk->w0);
}
}
// saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swapU");
// saveStep(chunks[0]->v[CENTER_LOC], "./chunks/swapV");
// saveStep(chunks[0]->w[CENTER_LOC], "./chunks/swapW");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/swapU0");
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/swapV0");
// saveStep(chunks[0]->w0[CENTER_LOC], "./chunks/swapW0");
// printf("after swap vecs u\n");
// printLayer(chunks[0]->u[CENTER_LOC],targetLayer);
// printf("after swap vecs u0\n");
// printLayer(chunks[0]->u0[CENTER_LOC],targetLayer);
//solve vector diffusion
{
for(int l = 0; l < FLUID_GRID2_VECTOR_DIFFUSE_TIMES; l++){
@ -116,20 +111,6 @@ void fluid_grid2_simulate(
Chunk * currentChunk = chunks[i];
fluid_grid2_solveVectorDiffuse(currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep);
}
// if(SAVE_STEPS){
// sprintf(fileNameBuff, "./chunks/diffuseUStep%dx", l);
// saveStep(chunks[0]->u[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseUStep%dx0", l);
// saveStep(chunks[0]->u0[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseVStep%dx", l);
// saveStep(chunks[0]->v[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseVStep%dx0", l);
// saveStep(chunks[0]->v0[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseWStep%dx", l);
// saveStep(chunks[0]->w[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseWStep%dx0", l);
// saveStep(chunks[0]->w0[CENTER_LOC], fileNameBuff);
// }
//update array for vectors
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
@ -146,38 +127,13 @@ void fluid_grid2_simulate(
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,0,currentChunk->v0);
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,0,currentChunk->w0);
}
// if(SAVE_STEPS){
// sprintf(fileNameBuff, "./chunks/diffuseUStep%dxBnd", l);
// saveStep(chunks[0]->u[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseUStep%dx0Bnd", l);
// saveStep(chunks[0]->u0[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseVStep%dxBnd", l);
// saveStep(chunks[0]->v[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseVStep%dx0Bnd", l);
// saveStep(chunks[0]->v0[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseWStep%dxBnd", l);
// saveStep(chunks[0]->w[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/diffuseWStep%dx0Bnd", l);
// saveStep(chunks[0]->w0[CENTER_LOC], fileNameBuff);
// }
}
}
// saveStep(chunks[0]->u[CENTER_LOC], "./chunks/diffuseU");
// saveStep(chunks[0]->v[CENTER_LOC], "./chunks/diffuseV");
// saveStep(chunks[0]->w[CENTER_LOC], "./chunks/diffuseW");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/diffuseU0");
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/diffuseV0");
// saveStep(chunks[0]->w0[CENTER_LOC], "./chunks/diffuseW0");
//solve projection
{
//update array for vectors
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
// setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u);
// setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v);
// setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w);
// setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0);
// setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0);
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,1,currentChunk->u);
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,2,currentChunk->v);
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,3,currentChunk->w);
@ -190,9 +146,6 @@ void fluid_grid2_simulate(
fluid_grid2_setupProjection(currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep);
}
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1Div");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/setupProj1P");
//update array for vectors
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
@ -202,9 +155,6 @@ void fluid_grid2_simulate(
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,0,currentChunk->v0);
}
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1DivBnd");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/setupProj1PBnd");
//samples u0, v0
//sets u0
//these should have just been mirrored in the above
@ -215,23 +165,11 @@ void fluid_grid2_simulate(
Chunk * currentChunk = chunks[i];
fluid_grid2_solveProjection(currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep);
}
// if(SAVE_STEPS){
// sprintf(fileNameBuff, "./chunks/proj1Step%dx", l);
// saveStep(chunks[0]->u0[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/proj1Step%dx0", l);
// saveStep(chunks[0]->v0[CENTER_LOC], fileNameBuff);
// }
for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i];
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,0,currentChunk->u0);
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,0,currentChunk->u0);
}
// if(SAVE_STEPS){
// sprintf(fileNameBuff, "./chunks/proj1Step%dxBnd", l);
// saveStep(chunks[0]->u0[CENTER_LOC], fileNameBuff);
// sprintf(fileNameBuff, "./chunks/proj1Step%dx0Bnd", l);
// saveStep(chunks[0]->v0[CENTER_LOC], fileNameBuff);
// }
}
//samples u,v,w,u0
//sets u,v,w
@ -241,10 +179,6 @@ void fluid_grid2_simulate(
fluid_grid2_finalizeProjection(currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep);
}
// saveStep(chunks[0]->u[CENTER_LOC], "./chunks/finalizeProj1U");
// saveStep(chunks[0]->v[CENTER_LOC], "./chunks/finalizeProj1V");
// saveStep(chunks[0]->w[CENTER_LOC], "./chunks/finalizeProj1W");
// exit(0);
//set boundaries a final time for u,v,w
//...
for(int i = 0; i < numChunks; i++){
@ -263,13 +197,6 @@ void fluid_grid2_simulate(
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,3,currentChunk->w0);
}
}
// saveStep(chunks[0]->u[CENTER_LOC], "./chunks/projU");
// saveStep(chunks[0]->v[CENTER_LOC], "./chunks/projV");
// saveStep(chunks[0]->w[CENTER_LOC], "./chunks/projW");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/projU0");
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/projV0");
// saveStep(chunks[0]->w0[CENTER_LOC], "./chunks/projW0");
// exit(0);
//swap all vector fields
{
//swap vector fields
@ -304,12 +231,6 @@ void fluid_grid2_simulate(
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,3,currentChunk->w0);
}
}
// saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swap2U");
// saveStep(chunks[0]->v[CENTER_LOC], "./chunks/swap2V");
// saveStep(chunks[0]->w[CENTER_LOC], "./chunks/swap2W");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/swap2U0");
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/swap2V0");
// saveStep(chunks[0]->w0[CENTER_LOC], "./chunks/swap2W0");
//advect vectors across boundaries
{
//update border arrs
@ -344,12 +265,6 @@ void fluid_grid2_simulate(
fluid_grid2_copyNeighborsRaw(currentChunk->chunkMask,0,3,currentChunk->w);
}
}
// saveStep(chunks[0]->u[CENTER_LOC], "./chunks/advectU");
// saveStep(chunks[0]->v[CENTER_LOC], "./chunks/advectV");
// saveStep(chunks[0]->w[CENTER_LOC], "./chunks/advectW");
// saveStep(chunks[0]->u0[CENTER_LOC], "./chunks/advectU0");
// saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/advectV0");
// saveStep(chunks[0]->w0[CENTER_LOC], "./chunks/advectW0");
//solve projection
{
//update array for vectors
@ -589,4 +504,51 @@ static inline void fluid_grid2_clearArr(float ** d){
for(int j = 0; j < DIM * DIM * DIM; j++){
x[j] = 0;
}
}
}
/**
* Allocates the arrays necessary for grid2 simulation
*/
void fluid_grid2_allocate_arrays(){
fluid_grid2_borderArr = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
for(int x = 0; x < DIM; x++){
for(int y = 0; y < DIM; y++){
for(int z = 0; z < DIM; z++){
if(x == 0 || x == DIM-1 || y == 0 || y == DIM-1 || z == 0 || z == DIM-1){
fluid_grid2_borderArr[IX(x,y,z)] = 1;
} else {
fluid_grid2_borderArr[IX(x,y,z)] = 0;
}
}
}
}
fluid_grid2_neighborArr_d = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_d0 = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_u = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_v = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_w = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_u0 = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_v0 = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_w0 = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
fluid_grid2_neighborArr_bounds = (float *)calloc(1,DIM * DIM * DIM * sizeof(float));
}

View File

@ -29,7 +29,7 @@ public class FluidAcceleratedSimulator implements ServerFluidSimulator {
/**
* The gravity constant
*/
public static final float GRAVITY_CONST = -1000;
public static final float GRAVITY_CONST = -10f;
/**
* Load fluid sim library