Compare commits

..

3 Commits

Author SHA1 Message Date
unknown
6afbbd7e2a clean up density calls
All checks were successful
studiorailgun/fluid-sim/pipeline/head This commit looks good
2024-03-10 17:45:51 -04:00
unknown
6b585b367b swapped all density functions to raw arrays 2024-03-10 17:43:48 -04:00
unknown
085cd18fdf swap diffusion solver to raw arrays 2024-03-10 17:39:21 -04:00
4 changed files with 245 additions and 94 deletions

View File

@ -40,8 +40,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_solveDiffuseDensity
jobject this, jobject this,
jint N, jint N,
jint chunk_mask, jint chunk_mask,
jobjectArray jrx, float ** d,
jobjectArray jrx0, float ** d0,
jobjectArray jru, jobjectArray jru,
jobjectArray jrv, jobjectArray jrv,
jobjectArray jrw, jobjectArray jrw,
@ -51,8 +51,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_solveDiffuseDensity
float a=dt*DIFFUSION_CONST*N*N*N; float a=dt*DIFFUSION_CONST*N*N*N;
float c=1+6*a; float c=1+6*a;
int i, j, k, l, m; int i, j, k, l, m;
float * x = GET_ARR(env,jrx,CENTER_LOC); float * x = GET_ARR_RAW(env,d,CENTER_LOC);
float * x0 = GET_ARR(env,jrx0,CENTER_LOC); float * x0 = GET_ARR_RAW(env,d0,CENTER_LOC);
__m256 aScalar = _mm256_set1_ps(a); __m256 aScalar = _mm256_set1_ps(a);
__m256 cScalar = _mm256_set1_ps(c); __m256 cScalar = _mm256_set1_ps(c);

View File

@ -700,14 +700,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk; chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask; chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd;
jd0 = currentChunk->jd0;
u = currentChunk->ju;
v = currentChunk->jv;
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_addDensity(env,chunkJRaw,DIM,chunkMask,currentChunk->d,currentChunk->d0,timestep); Java_electrosphere_FluidSim_addDensity(env,chunkJRaw,DIM,chunkMask,currentChunk->d,currentChunk->d0,timestep);
} }
} }
@ -716,23 +708,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//swap vector fields //swap vector fields
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd;
jd0 = currentChunk->jd0;
u = currentChunk->ju;
v = currentChunk->jv;
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
setBuffArr(dJId,jd0);
setBuffArr(d0JId,jd);
jobject tmpObj;
tmpObj = currentChunk->jd;
currentChunk->jd = currentChunk->jd0;
currentChunk->jd0 = tmpObj;
float * tmpArr; float * tmpArr;
for(int j = 0; j < 27; j++){ for(int j = 0; j < 27; j++){
@ -747,14 +722,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
chunkMask = currentChunk->chunkMask; chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd; jd = currentChunk->jd;
jd0 = currentChunk->jd0; jd0 = currentChunk->jd0;
u = currentChunk->ju; copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,0,currentChunk->d);
v = currentChunk->jv; copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,0,currentChunk->d0);
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,jd);
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,jd0);
} }
} }
//diffuse density //diffuse density
@ -764,29 +733,16 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk; chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask; chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd;
jd0 = currentChunk->jd0;
u = currentChunk->ju; u = currentChunk->ju;
v = currentChunk->jv; v = currentChunk->jv;
w = currentChunk->jw; w = currentChunk->jw;
u0 = currentChunk->ju0; Java_electrosphere_FluidSim_solveDiffuseDensity(env,chunkJRaw,DIM,chunkMask,currentChunk->d,currentChunk->d0,u,v,w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_solveDiffuseDensity(env,chunkJRaw,DIM,chunkMask,jd,jd0,u,v,w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk; chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask; chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd; setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,currentChunk->d);
jd0 = currentChunk->jd0;
u = currentChunk->ju;
v = currentChunk->jv;
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,0,jd);
} }
} }
} }
@ -795,24 +751,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//swap vector fields //swap vector fields
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd;
jd0 = currentChunk->jd0;
u = currentChunk->ju;
v = currentChunk->jv;
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
setBuffArr(dJId,jd0);
setBuffArr(d0JId,jd);
jobject tmpObj;
tmpObj = currentChunk->jd;
currentChunk->jd = currentChunk->jd0;
currentChunk->jd0 = tmpObj;
float * tmpArr; float * tmpArr;
for(int j = 0; j < 27; j++){ for(int j = 0; j < 27; j++){
tmpArr = currentChunk->d[j]; tmpArr = currentChunk->d[j];
@ -824,16 +762,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk; chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask; chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd; copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,0,currentChunk->d);
jd0 = currentChunk->jd0; copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,0,currentChunk->d0);
u = currentChunk->ju;
v = currentChunk->jv;
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,jd);
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,jd0);
} }
} }
//advect density //advect density
@ -842,14 +772,9 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk; chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask; chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd;
jd0 = currentChunk->jd0;
u = currentChunk->ju; u = currentChunk->ju;
v = currentChunk->jv; v = currentChunk->jv;
w = currentChunk->jw; w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_advectDensity(env,chunkJRaw,DIM,chunkMask,currentChunk->d,currentChunk->d0,u,v,w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep); Java_electrosphere_FluidSim_advectDensity(env,chunkJRaw,DIM,chunkMask,currentChunk->d,currentChunk->d0,u,v,w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
} }
@ -859,14 +784,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkJRaw = currentChunk->jchunk; chunkJRaw = currentChunk->jchunk;
chunkMask = currentChunk->chunkMask; chunkMask = currentChunk->chunkMask;
jd = currentChunk->jd;
jd0 = currentChunk->jd0;
u = currentChunk->ju;
v = currentChunk->jv;
w = currentChunk->jw;
u0 = currentChunk->ju0;
v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,currentChunk->d); setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,currentChunk->d);
} }
} }

View File

@ -73,7 +73,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_addDensity
* Signature: (II[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;FFF)V * Signature: (II[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;FFF)V
*/ */
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_solveDiffuseDensity JNIEXPORT void JNICALL Java_electrosphere_FluidSim_solveDiffuseDensity
(JNIEnv *, jobject, jint, jint, jobjectArray, jobjectArray, jobjectArray, jobjectArray, jobjectArray, jfloat, jfloat, jfloat); (JNIEnv *, jobject, jint, jint, float **, float **, jobjectArray, jobjectArray, jobjectArray, jfloat, jfloat, jfloat);
/* /*
* Class: electrosphere_FluidSim * Class: electrosphere_FluidSim
@ -107,4 +107,13 @@ JNIEXPORT void JNICALL setBoundsToNeighborsRaw
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_copyNeighbors JNIEXPORT void JNICALL Java_electrosphere_FluidSim_copyNeighbors
(JNIEnv *, jobject, jint, jint, jint, jint, jobjectArray); (JNIEnv *, jobject, jint, jint, jint, jint, jobjectArray);
JNIEXPORT void JNICALL copyNeighborsRaw
(JNIEnv * env,
jobject this,
jint N,
jint chunk_mask,
jint cx,
jint vector_dir,
float ** neighborArray);
#endif #endif

View File

@ -782,6 +782,231 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_setBoundsToNeighbors
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); 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);
} }
/**
* This exclusively copies neighbors to make sure zeroing out stuff doesn't break sim
*/
JNIEXPORT void JNICALL copyNeighborsRaw
(JNIEnv * env,
jobject this,
jint N,
jint chunk_mask,
jint cx,
jint vector_dir,
float ** neighborArray){
int DIM = N;
float * target = GET_ARR_RAW(env,neighborArray,CENTER_LOC);
float * source;
//
//
// PLANES
//
//
if(ARR_EXISTS(chunk_mask,0,1,1)){
source = GET_ARR_RAW(env,neighborArray,CK(0,1,1));
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
target[IX(0,x,y)] = source[IX(DIM-2,x,y)];
}
}
}
if(ARR_EXISTS(chunk_mask,2,1,1)){
source = GET_ARR_RAW(env,neighborArray,CK(2,1,1));
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
target[IX(DIM-1,x,y)] = source[IX(1,x,y)];
}
}
}
if(ARR_EXISTS(chunk_mask,1,0,1)){
source = GET_ARR_RAW(env,neighborArray,CK(1,0,1));
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
target[IX(x,0,y)] = source[IX(x,DIM-2,y)];
}
}
}
if(ARR_EXISTS(chunk_mask,1,2,1)){
source = GET_ARR_RAW(env,neighborArray,CK(1,2,1));
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
target[IX(x,DIM-1,y)] = source[IX(x,1,y)];
}
}
}
if(ARR_EXISTS(chunk_mask,1,1,0)){
source = GET_ARR_RAW(env,neighborArray,CK(1,1,0));
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
target[IX(x,y,0)] = source[IX(x,y,DIM-2)];
}
}
}
if(ARR_EXISTS(chunk_mask,1,1,2)){
source = GET_ARR_RAW(env,neighborArray,CK(1,1,2));
for(int x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){
target[IX(x,y,DIM-1)] = source[IX(x,y,1)];
}
}
}
//
//
// EDGES
//
//
if(ARR_EXISTS(chunk_mask,0,0,1)){
source = GET_ARR_RAW(env,neighborArray,CK(0,0,1));
for(int x=1; x < DIM-1; x++){
target[IX(0,0,x)] = source[IX(DIM-2,DIM-2,x)];
}
}
if(ARR_EXISTS(chunk_mask,2,0,1)){
source = GET_ARR_RAW(env,neighborArray,CK(2,0,1));
for(int x=1; x < DIM-1; x++){
target[IX(DIM-1,0,x)] = source[IX(1,DIM-2,x)];
}
}
if(ARR_EXISTS(chunk_mask,0,2,1)){
source = GET_ARR_RAW(env,neighborArray,CK(0,2,1));
for(int x=1; x < DIM-1; x++){
target[IX(0,DIM-1,x)] = source[IX(DIM-2,1,x)];
}
}
if(ARR_EXISTS(chunk_mask,2,2,1)){
source = GET_ARR_RAW(env,neighborArray,CK(2,2,1));
for(int x=1; x < DIM-1; x++){
target[IX(DIM-1,DIM-1,x)] = source[IX(1,1,x)];
}
}
//
//
if(ARR_EXISTS(chunk_mask,0,1,0)){
source = GET_ARR_RAW(env,neighborArray,CK(0,1,0));
for(int x=1; x < DIM-1; x++){
target[IX(0,x,0)] = source[IX(DIM-2,x,DIM-2)];
}
}
if(ARR_EXISTS(chunk_mask,2,1,0)){
source = GET_ARR_RAW(env,neighborArray,CK(2,1,0));
for(int x=1; x < DIM-1; x++){
target[IX(DIM-1,x,0)] = source[IX(1,x,DIM-2)];
}
}
if(ARR_EXISTS(chunk_mask,0,1,2)){
source = GET_ARR_RAW(env,neighborArray,CK(0,1,2));
for(int x=1; x < DIM-1; x++){
target[IX(0,x,DIM-1)] = source[IX(DIM-2,x,1)];
}
}
if(ARR_EXISTS(chunk_mask,2,1,2)){
source = GET_ARR_RAW(env,neighborArray,CK(2,1,2));
for(int x=1; x < DIM-1; x++){
target[IX(DIM-1,x,DIM-1)] = source[IX(1,x,1)];
}
}
//
//
if(ARR_EXISTS(chunk_mask,1,0,0)){
source = GET_ARR_RAW(env,neighborArray,CK(1,0,0));
for(int x=1; x < DIM-1; x++){
target[IX(x,0,0)] = source[IX(x,DIM-2,DIM-2)];
}
}
if(ARR_EXISTS(chunk_mask,1,2,0)){
source = GET_ARR_RAW(env,neighborArray,CK(1,2,0));
for(int x=1; x < DIM-1; x++){
target[IX(x,DIM-1,0)] = source[IX(x,1,DIM-2)];
}
}
if(ARR_EXISTS(chunk_mask,1,0,2)){
source = GET_ARR_RAW(env,neighborArray,CK(1,0,2));
for(int x=1; x < DIM-1; x++){
target[IX(x,0,DIM-1)] = source[IX(x,DIM-2,1)];
}
}
if(ARR_EXISTS(chunk_mask,1,2,2)){
source = GET_ARR_RAW(env,neighborArray,CK(1,2,2));
for(int x=1; x < DIM-1; x++){
target[IX(x,DIM-1,DIM-1)] = source[IX(x,1,1)];
}
}
//
//
// CORNERS
//
//
if(ARR_EXISTS(chunk_mask,0,0,0)){
source = GET_ARR_RAW(env,neighborArray,CK(0,0,0));
target[IX(0,0,0)] = source[IX(DIM-2,DIM-2,DIM-2)];
}
if(ARR_EXISTS(chunk_mask,2,0,0)){
source = GET_ARR_RAW(env,neighborArray,CK(2,0,0));
target[IX(DIM-1,0,0)] = source[IX(1,DIM-2,DIM-2)];
}
if(ARR_EXISTS(chunk_mask,0,2,0)){
source = GET_ARR_RAW(env,neighborArray,CK(0,2,0));
target[IX(0,DIM-1,0)] = source[IX(DIM-2,1,DIM-2)];
}
if(ARR_EXISTS(chunk_mask,2,2,0)){
source = GET_ARR_RAW(env,neighborArray,CK(2,2,0));
target[IX(DIM-1,DIM-1,0)] = source[IX(1,1,DIM-2)];
}
//
//
if(ARR_EXISTS(chunk_mask,0,0,2)){
source = GET_ARR_RAW(env,neighborArray,CK(0,0,2));
target[IX(0,0,DIM-1)] = source[IX(DIM-2,DIM-2,1)];
}
if(ARR_EXISTS(chunk_mask,2,0,2)){
source = GET_ARR_RAW(env,neighborArray,CK(2,0,2));
target[IX(DIM-1,0,DIM-1)] = source[IX(1,DIM-2,1)];
}
if(ARR_EXISTS(chunk_mask,0,2,2)){
source = GET_ARR_RAW(env,neighborArray,CK(0,2,2));
target[IX(0,DIM-1,DIM-1)] = source[IX(DIM-2,1,1)];
}
if(ARR_EXISTS(chunk_mask,2,2,2)){
source = GET_ARR_RAW(env,neighborArray,CK(2,2,2));
target[IX(DIM-1,DIM-1,DIM-1)] = source[IX(1,1,1)];
}
}
/** /**
* This exclusively copies neighbors to make sure zeroing out stuff doesn't break sim * This exclusively copies neighbors to make sure zeroing out stuff doesn't break sim
*/ */