cleaning up grid2 interfaces
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2024-12-09 18:35:15 -05:00
parent a142aa6f55
commit 2a2eeca701
8 changed files with 135 additions and 180 deletions

View File

@ -20,7 +20,6 @@ void fluid_grid2_advect(uint32_t chunk_mask, int b, float ** jrd, float ** jrd0,
*/ */
void fluid_grid2_addDensity( void fluid_grid2_addDensity(
Environment * environment, Environment * environment,
int chunk_mask,
float ** d, float ** d,
float ** d0, float ** d0,
float dt float dt
@ -33,14 +32,9 @@ void fluid_grid2_addDensity(
* A single iteration of the jacobi to solve density diffusion * A single iteration of the jacobi to solve density diffusion
*/ */
LIBRARY_API void fluid_grid2_solveDiffuseDensity( LIBRARY_API void fluid_grid2_solveDiffuseDensity(
int chunk_mask,
float ** d, float ** d,
float ** d0, float ** d0,
float ** jru,
float ** jrv,
float ** jrw,
float DIFFUSION_CONST, float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
); );
@ -51,7 +45,7 @@ LIBRARY_API void fluid_grid2_solveDiffuseDensity(
/** /**
* Advects the density based on the vectors * Advects the density based on the vectors
*/ */
void fluid_grid2_advectDensity(uint32_t chunk_mask, float ** d, float ** d0, float ** ur, float ** vr, float ** wr, float dt); void fluid_grid2_advectDensity(float ** d, float ** d0, float ** ur, float ** vr, float ** wr, float dt);

View File

@ -23,17 +23,6 @@ LIBRARY_API void fluid_grid2_setBoundsToNeighborsRaw(
); );
/**
* This exclusively copies neighbors to make sure zeroing out stuff doesn't break sim
*/
void fluid_grid2_copyNeighborsRaw(
int chunk_mask,
int cx,
int vector_dir,
float ** neighborArray
);
@ -45,7 +34,7 @@ void fluid_grid2_copyNeighborsRaw(
/** /**
* Sums the density of the chunk * Sums the density of the chunk
*/ */
double fluid_grid2_calculateSum(uint32_t chunk_mask, float ** d); double fluid_grid2_calculateSum(float ** d);

View File

@ -7,28 +7,39 @@
/**
* Used for signaling the bounds setting method to not use adjacent cells when evaluating borders
*/
#define FLUID_GRID2_BOUND_NO_DIR 0 #define FLUID_GRID2_BOUND_NO_DIR 0
/**
* Used for signaling the bounds setting method to use adjacent cells when evaluating x axis borders
*/
#define FLUID_GRID2_BOUND_DIR_U 1 #define FLUID_GRID2_BOUND_DIR_U 1
/**
* Used for signaling the bounds setting method to use adjacent cells when evaluating y axis borders
*/
#define FLUID_GRID2_BOUND_DIR_V 2 #define FLUID_GRID2_BOUND_DIR_V 2
/**
* Used for signaling the bounds setting method to use adjacent cells when evaluating z axis borders
*/
#define FLUID_GRID2_BOUND_DIR_W 3 #define FLUID_GRID2_BOUND_DIR_W 3
/** /**
* Adds the sources to the destinations * Adds the sources to the destinations
*/ */
void fluid_grid2_addSourceToVectors void fluid_grid2_addSourceToVectors(
(
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0, float ** jrw0,
float DIFFUSION_CONST, float dt
float VISCOSITY_CONST, );
float dt);
@ -42,19 +53,14 @@ void fluid_grid2_addSourceToVectors
* @param wr The z velocity grid * @param wr The z velocity grid
* @param pr The grid that will contain the first derivative * @param pr The grid that will contain the first derivative
* @param divr The grid that will be zeroed out in preparation of the solver * @param divr The grid that will be zeroed out in preparation of the solver
* @param DIFFUSION_CONST The diffusion constant
* @param VISCOSITY_CONST The viscosity constant
* @param dt The timestep for the simulation * @param dt The timestep for the simulation
*/ */
void fluid_grid2_setupProjection( void fluid_grid2_setupProjection(
int chunk_mask,
float ** ur, float ** ur,
float ** vr, float ** vr,
float ** wr, float ** wr,
float ** pr, float ** pr,
float ** divr, float ** divr,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
); );
@ -67,15 +73,8 @@ void fluid_grid2_setupProjection(
* @param jrv0 The first derivative field * @param jrv0 The first derivative field
*/ */
void fluid_grid2_solveProjection( void fluid_grid2_solveProjection(
int chunk_mask,
float ** jru,
float ** jrv,
float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
); );
@ -86,15 +85,11 @@ void fluid_grid2_solveProjection(
* Thus we are left with an approximately mass-conserved field. * Thus we are left with an approximately mass-conserved field.
*/ */
void fluid_grid2_finalizeProjection( void fluid_grid2_finalizeProjection(
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
); );
@ -104,37 +99,31 @@ void fluid_grid2_finalizeProjection(
* Advects u, v, and w * Advects u, v, and w
*/ */
void fluid_grid2_advectVectors( void fluid_grid2_advectVectors(
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0, float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
); );
/** /**
* Actually performs the advection * Actually performs the advection
*/ */
void fluid_grid2_advect_velocity(uint32_t chunk_mask, int b, float ** jrd, float ** jrd0, float * u, float * v, float * w, float dt); void fluid_grid2_advect_velocity(int b, float ** jrd, float ** jrd0, float * u, float * v, float * w, float dt);
/* /*
* Solves vector diffusion along all axis * Solves vector diffusion along all axis
*/ */
void fluid_grid2_solveVectorDiffuse ( void fluid_grid2_solveVectorDiffuse (
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0, float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
); );

View File

@ -1,7 +1,6 @@
#include <stdio.h> #include <stdio.h>
#include <immintrin.h> #include <immintrin.h>
#include <stdint.h> #include <stdint.h>
#include <jni.h>
#include "fluid/env/utilities.h" #include "fluid/env/utilities.h"
#include "fluid/queue/chunkmask.h" #include "fluid/queue/chunkmask.h"
@ -17,7 +16,6 @@
*/ */
void fluid_grid2_addDensity( void fluid_grid2_addDensity(
Environment * environment, Environment * environment,
int chunk_mask,
float ** d, float ** d,
float ** d0, float ** d0,
float dt float dt
@ -42,14 +40,9 @@ void fluid_grid2_addDensity(
* A single iteration of the jacobi to solve density diffusion * A single iteration of the jacobi to solve density diffusion
*/ */
LIBRARY_API void fluid_grid2_solveDiffuseDensity( LIBRARY_API void fluid_grid2_solveDiffuseDensity(
int chunk_mask,
float ** d, float ** d,
float ** d0, float ** d0,
float ** jru,
float ** jrv,
float ** jrw,
float DIFFUSION_CONST, float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
){ ){
float h = FLUID_GRID2_H; float h = FLUID_GRID2_H;
@ -92,7 +85,7 @@ LIBRARY_API void fluid_grid2_solveDiffuseDensity(
/** /**
* Advects the density based on the vectors * Advects the density based on the vectors
*/ */
void fluid_grid2_advectDensity(uint32_t chunk_mask, float ** d, float ** d0, float ** ur, float ** vr, float ** wr, float dt){ void fluid_grid2_advectDensity(float ** d, float ** d0, float ** ur, float ** vr, float ** wr, float dt){
int i, j, k, i0, j0, k0, i1, j1, k1; int i, j, k, i0, j0, k0, i1, j1, k1;
int m,n,o; int m,n,o;
float x, y, z, s0, t0, s1, t1, u1, u0, dtx,dty,dtz; float x, y, z, s0, t0, s1, t1, u1, u0, dtx,dty,dtz;
@ -242,21 +235,6 @@ void fluid_grid2_advectDensity(uint32_t chunk_mask, float ** d, float ** d0, flo
} }
} }
/**
* Sums the density of the chunk
*/
double fluid_grid2_calculateSum(uint32_t chunk_mask, float ** d){
int j;
int size=DIM*DIM*DIM;
float * x = GET_ARR_RAW(d,CENTER_LOC);
double rVal = 0;
for(j=0; j<size; j++){
rVal = rVal + x[j];
}
return rVal;
}
/** /**
* Normalizes the density array with a given ratio * Normalizes the density array with a given ratio
*/ */

View File

@ -63,15 +63,12 @@ void fluid_grid2_simulate(
//add velocity //add velocity
fluid_grid2_applyGravity(currentChunk,environment); fluid_grid2_applyGravity(currentChunk,environment);
fluid_grid2_addSourceToVectors( fluid_grid2_addSourceToVectors(
currentChunk->chunkMask,
currentChunk->u, currentChunk->u,
currentChunk->v, currentChunk->v,
currentChunk->w, currentChunk->w,
currentChunk->u0, currentChunk->u0,
currentChunk->v0, currentChunk->v0,
currentChunk->w0, currentChunk->w0,
FLUID_GRID2_DIFFUSION_CONSTANT,
FLUID_GRID2_VISCOSITY_CONSTANT,
timestep timestep
); );
//swap all vector fields //swap all vector fields
@ -96,14 +93,14 @@ void fluid_grid2_simulate(
//solve vector diffusion //solve vector diffusion
for(int l = 0; l < FLUID_GRID2_VECTOR_DIFFUSE_TIMES; l++){ for(int l = 0; l < FLUID_GRID2_VECTOR_DIFFUSE_TIMES; l++){
//solve vector diffusion //solve vector diffusion
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); fluid_grid2_solveVectorDiffuse(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,timestep);
//update array for vectors //update array for vectors
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_V,currentChunk->v); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_V,currentChunk->v);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_W,currentChunk->w); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_W,currentChunk->w);
} }
//setup projection //setup projection
fluid_grid2_setupProjection(currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep); fluid_grid2_setupProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//update array for vectors //update array for vectors
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0);
@ -115,13 +112,13 @@ void fluid_grid2_simulate(
// //
//Perform main projection solver //Perform main projection solver
for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){ for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
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); fluid_grid2_solveProjection(currentChunk->u0,currentChunk->v0,timestep);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0);
} }
//samples u,v,w,u0 //samples u,v,w,u0
//sets u,v,w //sets u,v,w
//Finalize projection //Finalize projection
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); fluid_grid2_finalizeProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//set boundaries a final time for u,v,w //set boundaries a final time for u,v,w
//... //...
@ -149,13 +146,13 @@ void fluid_grid2_simulate(
} }
//advect vectors across boundaries //advect vectors across boundaries
//advect //advect
fluid_grid2_advectVectors(currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep); fluid_grid2_advectVectors(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,timestep);
//update neighbor arr //update neighbor arr
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_V,currentChunk->v); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_V,currentChunk->v);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_W,currentChunk->w); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_W,currentChunk->w);
//setup projection //setup projection
fluid_grid2_setupProjection(currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep); fluid_grid2_setupProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//update array for vectors //update array for vectors
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u0); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u0);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_V,currentChunk->v0); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_V,currentChunk->v0);
@ -165,13 +162,13 @@ void fluid_grid2_simulate(
// //
//Perform main projection solver //Perform main projection solver
for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){ for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
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); fluid_grid2_solveProjection(currentChunk->u0,currentChunk->v0,timestep);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_NO_DIR,currentChunk->u0);
} }
//samples u,v,w,u0 //samples u,v,w,u0
//sets u,v,w //sets u,v,w
//Finalize projection //Finalize projection
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); fluid_grid2_finalizeProjection(currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,timestep);
//set boundaries a final time for u,v,w //set boundaries a final time for u,v,w
//... //...
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,FLUID_GRID2_BOUND_DIR_U,currentChunk->u);
@ -197,7 +194,7 @@ void fluid_grid2_simulate(
environment->state.newDensity = 0; environment->state.newDensity = 0;
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
fluid_grid2_addDensity(environment,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,timestep); fluid_grid2_addDensity(environment,currentChunk->d,currentChunk->d0,timestep);
//swap all density arrays //swap all density arrays
//swap vector fields //swap vector fields
@ -209,7 +206,7 @@ void fluid_grid2_simulate(
} }
//diffuse density //diffuse density
for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){ for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
fluid_grid2_solveDiffuseDensity(currentChunk->chunkMask,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,timestep); fluid_grid2_solveDiffuseDensity(currentChunk->d,currentChunk->d0,FLUID_GRID2_DIFFUSION_CONSTANT,timestep);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,0,currentChunk->d); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,0,currentChunk->d);
} }
//swap all density arrays //swap all density arrays
@ -220,7 +217,7 @@ void fluid_grid2_simulate(
currentChunk->d0[j] = tmpArr; currentChunk->d0[j] = tmpArr;
} }
//advect density //advect density
fluid_grid2_advectDensity(currentChunk->chunkMask,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,timestep); fluid_grid2_advectDensity(currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,timestep);
} }
//mirror densities //mirror densities
{ {
@ -234,7 +231,7 @@ void fluid_grid2_simulate(
double transformedDensity = 0; double transformedDensity = 0;
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
transformedDensity = transformedDensity + fluid_grid2_calculateSum(currentChunk->chunkMask,currentChunk->d); transformedDensity = transformedDensity + fluid_grid2_calculateSum(currentChunk->d);
} }
float normalizationRatio = 0; float normalizationRatio = 0;
if(transformedDensity != 0){ if(transformedDensity != 0){

View File

@ -0,0 +1,94 @@
#include <stdio.h>
#include <stdint.h>
#include "fluid/env/utilities.h"
#include "fluid/queue/chunkmask.h"
#include "fluid/env/environment.h"
#include "fluid/queue/chunk.h"
#include "fluid/sim/grid2/solver_consts.h"
#include "fluid/sim/grid2/utilities.h"
#include "fluid/sim/grid2/velocity.h"
/**
* Adds from a source array to a destination array
*/
void fluid_grid2_add_source(float * x, float * s, float dt){
int i;
int size=DIM*DIM*DIM;
for(i=0; i<size; i++){
x[i] += dt*s[i];
}
}
/**
* Sets the bounds of this cube to those of its neighbor
*/
LIBRARY_API void fluid_grid2_setBoundsToNeighborsRaw(
int chunk_mask,
int vector_dir,
float ** neighborArray
){
float * target = GET_ARR_RAW(neighborArray,CENTER_LOC);
float * source;
//set the faces bounds
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
//((x)+(DIM)*(y) + (DIM)*(DIM)*(z))
target[IX(0,x,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_U ? -target[IX(1,x,y)] : target[IX(1,x,y)];
target[IX(DIM-1,x,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_U ? -target[IX(DIM-2,x,y)] : target[IX(DIM-2,x,y)];
target[IX(x,0,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_V ? -target[IX(x,1,y)] : target[IX(x,1,y)];
target[IX(x,DIM-1,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_V ? -target[IX(x,DIM-2,y)] : target[IX(x,DIM-2,y)];
target[IX(x,y,0)] = vector_dir==FLUID_GRID2_BOUND_DIR_W ? -target[IX(x,y,1)] : target[IX(x,y,1)];
target[IX(x,y,DIM-1)] = vector_dir==FLUID_GRID2_BOUND_DIR_W ? -target[IX(x,y,DIM-2)] : target[IX(x,y,DIM-2)];
}
}
//sets the edges of the chunk
for(int x = 1; x < DIM-1; x++){
target[IX(x,0,0)] = (float)(0.5f * (target[IX(x,1,0)] + target[IX(x,0,1)]));
target[IX(x,DIM-1,0)] = (float)(0.5f * (target[IX(x,DIM-2,0)] + target[IX(x,DIM-1,1)]));
target[IX(x,0,DIM-1)] = (float)(0.5f * (target[IX(x,1,DIM-1)] + target[IX(x,0,DIM-2)]));
target[IX(x,DIM-1,DIM-1)] = (float)(0.5f * (target[IX(x,DIM-2,DIM-1)] + target[IX(x,DIM-1,DIM-2)]));
target[IX(0,x,0)] = (float)(0.5f * (target[IX(1,x,0)] + target[IX(0,x,1)]));
target[IX(DIM-1,x,0)] = (float)(0.5f * (target[IX(DIM-2,x,0)] + target[IX(DIM-1,x,1)]));
target[IX(0,x,DIM-1)] = (float)(0.5f * (target[IX(1,x,DIM-1)] + target[IX(0,x,DIM-2)]));
target[IX(DIM-1,x,DIM-1)] = (float)(0.5f * (target[IX(DIM-2,x,DIM-1)] + target[IX(DIM-1,x,DIM-2)]));
target[IX(0,0,x)] = (float)(0.5f * (target[IX(1,0,x)] + target[IX(0,1,x)]));
target[IX(DIM-1,0,x)] = (float)(0.5f * (target[IX(DIM-2,0,x)] + target[IX(DIM-1,1,x)]));
target[IX(0,DIM-1,x)] = (float)(0.5f * (target[IX(1,DIM-1,x)] + target[IX(0,DIM-2,x)]));
target[IX(DIM-1,DIM-1,x)] = (float)(0.5f * (target[IX(DIM-2,DIM-1,x)] + target[IX(DIM-1,DIM-2,x)]));
}
//sets the corners of the chunk
target[IX(0,0,0)] = (float)((target[IX(1,0,0)]+target[IX(0,1,0)]+target[IX(0,0,1)])/3.0);
target[IX(DIM-1,0,0)] = (float)((target[IX(DIM-2,0,0)]+target[IX(DIM-1,1,0)]+target[IX(DIM-1,0,1)])/3.0);
target[IX(0,DIM-1,0)] = (float)((target[IX(1,DIM-1,0)]+target[IX(0,DIM-2,0)]+target[IX(0,DIM-1,1)])/3.0);
target[IX(0,0,DIM-1)] = (float)((target[IX(0,0,DIM-2)]+target[IX(1,0,DIM-1)]+target[IX(0,1,DIM-1)])/3.0);
target[IX(DIM-1,DIM-1,0)] = (float)((target[IX(DIM-2,DIM-1,0)]+target[IX(DIM-1,DIM-2,0)]+target[IX(DIM-1,DIM-1,1)])/3.0);
target[IX(0,DIM-1,DIM-1)] = (float)((target[IX(1,DIM-1,DIM-1)]+target[IX(0,DIM-2,DIM-1)]+target[IX(0,DIM-1,DIM-2)])/3.0);
target[IX(DIM-1,0,DIM-1)] = (float)((target[IX(DIM-1,0,DIM-2)]+target[IX(DIM-2,0,DIM-1)]+target[IX(DIM-1,1,DIM-1)])/3.0);
target[IX(DIM-1,DIM-1,DIM-1)] = (float)((target[IX(DIM-1,DIM-1,DIM-2)]+target[IX(DIM-1,DIM-2,DIM-1)]+target[IX(DIM-1,DIM-1,DIM-2)])/3.0);
}
/**
* Sums the density of the chunk
*/
double fluid_grid2_calculateSum(float ** d){
int j;
int size=DIM*DIM*DIM;
float * x = GET_ARR_RAW(d,CENTER_LOC);
double rVal = 0;
for(j=0; j<size; j++){
rVal = rVal + x[j];
}
return rVal;
}

View File

@ -21,49 +21,32 @@ void fluid_grid2_advect(uint32_t chunk_mask, int b, float ** jrd, float ** jrd0,
*/ */
void fluid_grid2_addSourceToVectors void fluid_grid2_addSourceToVectors
( (
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0, float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt){ float dt){
fluid_grid2_add_source(GET_ARR_RAW(jru,CENTER_LOC),GET_ARR_RAW(jru0,CENTER_LOC),dt); fluid_grid2_add_source(GET_ARR_RAW(jru,CENTER_LOC),GET_ARR_RAW(jru0,CENTER_LOC),dt);
fluid_grid2_add_source(GET_ARR_RAW(jrv,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),dt); fluid_grid2_add_source(GET_ARR_RAW(jrv,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),dt);
fluid_grid2_add_source(GET_ARR_RAW(jrw,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt); fluid_grid2_add_source(GET_ARR_RAW(jrw,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt);
} }
/**
* Adds from a source array to a destination array
*/
void fluid_grid2_add_source(float * x, float * s, float dt){
int i;
int size=DIM*DIM*DIM;
for(i=0; i<size; i++){
x[i] += dt*s[i];
}
}
/* /*
* Solves vector diffusion along all axis * Solves vector diffusion along all axis
*/ */
void fluid_grid2_solveVectorDiffuse ( void fluid_grid2_solveVectorDiffuse (
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0, float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
){ ){
float h = FLUID_GRID2_H; float h = FLUID_GRID2_H;
float a=dt*VISCOSITY_CONST/(h*h); float a=dt*FLUID_GRID2_VISCOSITY_CONSTANT/(h*h);
float c=1+6*a; float c=1+6*a;
int i, j, k, l, m; int i, j, k, l, m;
float * u = GET_ARR_RAW(jru,CENTER_LOC); float * u = GET_ARR_RAW(jru,CENTER_LOC);
@ -169,14 +152,11 @@ void fluid_grid2_solveVectorDiffuse (
* @param dt The timestep for the simulation * @param dt The timestep for the simulation
*/ */
void fluid_grid2_setupProjection( void fluid_grid2_setupProjection(
int chunk_mask,
float ** ur, float ** ur,
float ** vr, float ** vr,
float ** wr, float ** wr,
float ** pr, float ** pr,
float ** divr, float ** divr,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
){ ){
int i, j, k; int i, j, k;
@ -252,15 +232,8 @@ void fluid_grid2_setupProjection(
* @param jrv0 The first derivative field * @param jrv0 The first derivative field
*/ */
void fluid_grid2_solveProjection( void fluid_grid2_solveProjection(
int chunk_mask,
float ** jru,
float ** jrv,
float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
){ ){
int a = 1; int a = 1;
@ -304,15 +277,11 @@ void fluid_grid2_solveProjection(
* Thus we are left with an approximately mass-conserved field. * Thus we are left with an approximately mass-conserved field.
*/ */
void fluid_grid2_finalizeProjection( void fluid_grid2_finalizeProjection(
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
){ ){
int i, j, k; int i, j, k;
@ -388,26 +357,23 @@ void fluid_grid2_finalizeProjection(
* Advects u, v, and w * Advects u, v, and w
*/ */
void fluid_grid2_advectVectors( void fluid_grid2_advectVectors(
int chunk_mask,
float ** jru, float ** jru,
float ** jrv, float ** jrv,
float ** jrw, float ** jrw,
float ** jru0, float ** jru0,
float ** jrv0, float ** jrv0,
float ** jrw0, float ** jrw0,
float DIFFUSION_CONST,
float VISCOSITY_CONST,
float dt float dt
){ ){
fluid_grid2_advect_velocity(chunk_mask,1,jru,jru0,GET_ARR_RAW(jru0,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt); fluid_grid2_advect_velocity(1,jru,jru0,GET_ARR_RAW(jru0,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt);
fluid_grid2_advect_velocity(chunk_mask,2,jrv,jrv0,GET_ARR_RAW(jru0,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt); fluid_grid2_advect_velocity(2,jrv,jrv0,GET_ARR_RAW(jru0,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt);
fluid_grid2_advect_velocity(chunk_mask,3,jrw,jrw0,GET_ARR_RAW(jru0,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt); fluid_grid2_advect_velocity(3,jrw,jrw0,GET_ARR_RAW(jru0,CENTER_LOC),GET_ARR_RAW(jrv0,CENTER_LOC),GET_ARR_RAW(jrw0,CENTER_LOC),dt);
} }
/** /**
* Actually performs the advection * Actually performs the advection
*/ */
void fluid_grid2_advect_velocity(uint32_t chunk_mask, int b, float ** jrd, float ** jrd0, float * u, float * v, float * w, float dt){ void fluid_grid2_advect_velocity(int b, float ** jrd, float ** jrd0, float * u, float * v, float * w, float dt){
int i, j, k, i0, j0, k0, i1, j1, k1; int i, j, k, i0, j0, k0, i1, j1, k1;
int m,n,o; int m,n,o;
float x, y, z, s0, t0, s1, t1, u1, u0, dtx,dty,dtz; float x, y, z, s0, t0, s1, t1, u1, u0, dtx,dty,dtz;
@ -437,7 +403,7 @@ void fluid_grid2_advect_velocity(uint32_t chunk_mask, int b, float ** jrd, float
else if(z >= DIM){ o -= 1; } else if(z >= DIM){ o -= 1; }
//If the out of bounds coordinate is in bounds for a neighbor chunk, use that chunk as source instead //If the out of bounds coordinate is in bounds for a neighbor chunk, use that chunk as source instead
if(CK(m,n,o) != CENTER_LOC && ARR_EXISTS(chunk_mask,m,n,o)){ if(CK(m,n,o) != CENTER_LOC && GET_ARR_RAW(jrd,CK(m,n,o)) != NULL){
// if(i == 1 && j == 1 && k == 1){ // if(i == 1 && j == 1 && k == 1){
// printf("\narr indices: %d %d %d\n\n",m,n,o); // printf("\narr indices: %d %d %d\n\n",m,n,o);
@ -648,55 +614,3 @@ void fluid_grid2_advect_velocity(uint32_t chunk_mask, int b, float ** jrd, float
} }
} }
} }
/**
* Sets the bounds of this cube to those of its neighbor
*/
LIBRARY_API void fluid_grid2_setBoundsToNeighborsRaw(
int chunk_mask,
int vector_dir,
float ** neighborArray
){
float * target = GET_ARR_RAW(neighborArray,CENTER_LOC);
float * source;
//set the faces bounds
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
//((x)+(DIM)*(y) + (DIM)*(DIM)*(z))
target[IX(0,x,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_U ? -target[IX(1,x,y)] : target[IX(1,x,y)];
target[IX(DIM-1,x,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_U ? -target[IX(DIM-2,x,y)] : target[IX(DIM-2,x,y)];
target[IX(x,0,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_V ? -target[IX(x,1,y)] : target[IX(x,1,y)];
target[IX(x,DIM-1,y)] = vector_dir==FLUID_GRID2_BOUND_DIR_V ? -target[IX(x,DIM-2,y)] : target[IX(x,DIM-2,y)];
target[IX(x,y,0)] = vector_dir==FLUID_GRID2_BOUND_DIR_W ? -target[IX(x,y,1)] : target[IX(x,y,1)];
target[IX(x,y,DIM-1)] = vector_dir==FLUID_GRID2_BOUND_DIR_W ? -target[IX(x,y,DIM-2)] : target[IX(x,y,DIM-2)];
}
}
//sets the edges of the chunk
for(int x = 1; x < DIM-1; x++){
target[IX(x,0,0)] = (float)(0.5f * (target[IX(x,1,0)] + target[IX(x,0,1)]));
target[IX(x,DIM-1,0)] = (float)(0.5f * (target[IX(x,DIM-2,0)] + target[IX(x,DIM-1,1)]));
target[IX(x,0,DIM-1)] = (float)(0.5f * (target[IX(x,1,DIM-1)] + target[IX(x,0,DIM-2)]));
target[IX(x,DIM-1,DIM-1)] = (float)(0.5f * (target[IX(x,DIM-2,DIM-1)] + target[IX(x,DIM-1,DIM-2)]));
target[IX(0,x,0)] = (float)(0.5f * (target[IX(1,x,0)] + target[IX(0,x,1)]));
target[IX(DIM-1,x,0)] = (float)(0.5f * (target[IX(DIM-2,x,0)] + target[IX(DIM-1,x,1)]));
target[IX(0,x,DIM-1)] = (float)(0.5f * (target[IX(1,x,DIM-1)] + target[IX(0,x,DIM-2)]));
target[IX(DIM-1,x,DIM-1)] = (float)(0.5f * (target[IX(DIM-2,x,DIM-1)] + target[IX(DIM-1,x,DIM-2)]));
target[IX(0,0,x)] = (float)(0.5f * (target[IX(1,0,x)] + target[IX(0,1,x)]));
target[IX(DIM-1,0,x)] = (float)(0.5f * (target[IX(DIM-2,0,x)] + target[IX(DIM-1,1,x)]));
target[IX(0,DIM-1,x)] = (float)(0.5f * (target[IX(1,DIM-1,x)] + target[IX(0,DIM-2,x)]));
target[IX(DIM-1,DIM-1,x)] = (float)(0.5f * (target[IX(DIM-2,DIM-1,x)] + target[IX(DIM-1,DIM-2,x)]));
}
//sets the corners of the chunk
target[IX(0,0,0)] = (float)((target[IX(1,0,0)]+target[IX(0,1,0)]+target[IX(0,0,1)])/3.0);
target[IX(DIM-1,0,0)] = (float)((target[IX(DIM-2,0,0)]+target[IX(DIM-1,1,0)]+target[IX(DIM-1,0,1)])/3.0);
target[IX(0,DIM-1,0)] = (float)((target[IX(1,DIM-1,0)]+target[IX(0,DIM-2,0)]+target[IX(0,DIM-1,1)])/3.0);
target[IX(0,0,DIM-1)] = (float)((target[IX(0,0,DIM-2)]+target[IX(1,0,DIM-1)]+target[IX(0,1,DIM-1)])/3.0);
target[IX(DIM-1,DIM-1,0)] = (float)((target[IX(DIM-2,DIM-1,0)]+target[IX(DIM-1,DIM-2,0)]+target[IX(DIM-1,DIM-1,1)])/3.0);
target[IX(0,DIM-1,DIM-1)] = (float)((target[IX(1,DIM-1,DIM-1)]+target[IX(0,DIM-2,DIM-1)]+target[IX(0,DIM-1,DIM-2)])/3.0);
target[IX(DIM-1,0,DIM-1)] = (float)((target[IX(DIM-1,0,DIM-2)]+target[IX(DIM-2,0,DIM-1)]+target[IX(DIM-1,1,DIM-1)])/3.0);
target[IX(DIM-1,DIM-1,DIM-1)] = (float)((target[IX(DIM-1,DIM-1,DIM-2)]+target[IX(DIM-1,DIM-2,DIM-1)]+target[IX(DIM-1,DIM-1,DIM-2)])/3.0);
}

View File

@ -75,7 +75,7 @@ int fluid_sim_grid2_density_diffuse_test1(){
} }
//diffuse density //diffuse density
for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){ for(int l = 0; l < FLUID_GRID2_LINEARSOLVERTIMES; l++){
fluid_grid2_solveDiffuseDensity(currentChunk->chunkMask,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_VISCOSITY_CONSTANT,FLUID_GRID2_SIM_STEP); fluid_grid2_solveDiffuseDensity(currentChunk->d,currentChunk->d0,FLUID_GRID2_DIFFUSION_CONSTANT,FLUID_GRID2_SIM_STEP);
fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,0,currentChunk->d); fluid_grid2_setBoundsToNeighborsRaw(currentChunk->chunkMask,0,currentChunk->d);
} }
//swap all density arrays //swap all density arrays