Separate java interactions to separate c file

This commit is contained in:
unknown 2024-03-15 17:44:18 -04:00
parent c1d9a7a054
commit 3601e68b83
7 changed files with 311 additions and 305 deletions

View File

@ -14,6 +14,7 @@
"threadpool.h": "c", "threadpool.h": "c",
"electrosphere_fluidsim.h": "c", "electrosphere_fluidsim.h": "c",
"type_traits": "c", "type_traits": "c",
"mainfunctions.h": "c" "mainfunctions.h": "c",
"chunk.h": "c"
} }
} }

View File

@ -3,46 +3,6 @@
#include "includes/utilities.h" #include "includes/utilities.h"
#include "includes/chunkmask.h" #include "includes/chunkmask.h"
uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx);
/**
* Calculates the bitmask for available chunks for the provided chunk's neighbor array
*/
int calculateChunkMask(JNIEnv * env, jobjectArray jrx){
return matrix_transform(env,jrx);
}
/**
* Calculates a mask that represents all nearby chunks that are actually accessible and exist
*/
uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx){
//The returned value, an availability mask that contains the availability of each neighbor chunk
uint32_t rVal = 0;
//Add to maks for initial chunks
for(int i = 0; i < CENTER_LOC; i++){
if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){
rVal = rVal + 1;
}
rVal = rVal << 1;
}
//add 1 for center chunk because we already have that
rVal = rVal + 1;
rVal = rVal << 1;
//continue on for remaining chunks
for(int i = CENTER_LOC+1; i < 27; i++){
if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){
rVal = rVal + 1;
}
if(i < 26){
rVal = rVal << 1;
}
}
return rVal;
}
const uint32_t CHUNK_INDEX_ARR[] = { const uint32_t CHUNK_INDEX_ARR[] = {
CHUNK_000, CHUNK_100, CHUNK_200, CHUNK_000, CHUNK_100, CHUNK_200,
CHUNK_010, CHUNK_110, CHUNK_210, CHUNK_010, CHUNK_110, CHUNK_210,

View File

@ -51,10 +51,10 @@ rm -f ./*.dll
# OUTPUT_FILE="./velocitystep.o" # OUTPUT_FILE="./velocitystep.o"
# gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE # gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE
# COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -msse -msse2 -msse3 -mmmx -m3dnow" COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -msse -msse2 -msse3 -mmmx -m3dnow"
# INPUT_FILES="./chunkmask.c" INPUT_FILES="./javainterface.c"
# OUTPUT_FILE="./chunkmask.o" OUTPUT_FILE="./javainterface.o"
# gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE
COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -msse -msse2 -msse3 -mmmx -m3dnow" COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -march=native -Ofast -msse -msse2 -msse3 -mmmx -m3dnow"
INPUT_FILES="./fluidsim.c" INPUT_FILES="./fluidsim.c"
@ -66,7 +66,7 @@ gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OU
#compile shared object file #compile shared object file
OUTPUT_FILE="libfluidsim$LIB_ENDING" OUTPUT_FILE="libfluidsim$LIB_ENDING"
COMPILE_FLAGS="-shared" COMPILE_FLAGS="-shared"
INPUT_FILES="fluidsim.o" INPUT_FILES="fluidsim.o javainterface.o"
gcc $COMPILE_FLAGS $INPUT_FILES -o $OUTPUT_FILE gcc $COMPILE_FLAGS $INPUT_FILES -o $OUTPUT_FILE
#move to resources #move to resources

View File

@ -4,14 +4,12 @@
#include "includes/chunkmask.h" #include "includes/chunkmask.h"
#include "includes/electrosphere_FluidSim.h" #include "includes/electrosphere_FluidSim.h"
#include "includes/mainFunctions.h" #include "includes/mainFunctions.h"
#include "includes/chunk.h"
#include "./chunkmask.c" #include "./chunkmask.c"
#include "./velocitystep.c" #include "./velocitystep.c"
#include "./densitystep.c" #include "./densitystep.c"
//include stb ds
#define STB_DS_IMPLEMENTATION
#include "./lib/stb/stb_ds.h"
#define DIM 18 #define DIM 18
#define LINEARSOLVERTIMES 20 #define LINEARSOLVERTIMES 20
@ -23,126 +21,20 @@
char fileNameBuff[50]; char fileNameBuff[50];
/**
* A chunk
*/
typedef struct {
float * d[27];
float * d0[27];
float * u[27];
float * v[27];
float * w[27];
float * u0[27];
float * v0[27];
float * w0[27];
int chunkMask;
} Chunk;
//all chunks //all chunks
Chunk ** chunks = NULL; Chunk ** chunks = NULL;
#define getChunk(i) (*env)->CallObjectMethod(env,chunkList,jListGet,i)
#define getBuffArr(buffId) (*env)->GetObjectField(env,chunkJRaw,buffId)
#define setBuffArr(buffId,value) (*env)->SetObjectField(env,chunkJRaw,buffId,value)
//jni help: //jni help:
//https://stackoverflow.com/questions/39823375/clarification-about-getfieldid //https://stackoverflow.com/questions/39823375/clarification-about-getfieldid
void saveStep(float * values, const char * name); void saveStep(float * values, const char * name);
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( void simulate(
JNIEnv * env, int numChunks,
jclass class, Chunk ** passedInChunks,
jobject chunkList,
jfloat timestep jfloat timestep
){ ){
jclass listClass = (*env)->FindClass(env,"java/util/List"); chunks = passedInChunks;
jclass fluidSimClass = (*env)->FindClass(env,"electrosphere/FluidSim");
//JNIEnv *env, jclass clazz, const char *name, const char *sig
jmethodID jListSize = (*env)->GetMethodID(env, listClass, "size", "()I");
jmethodID jListGet = (*env)->GetMethodID(env, listClass, "get", "(I)Ljava/lang/Object;");
jmethodID jListAdd = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
//ByteBuffer[]
jfieldID dJId = (*env)->GetFieldID(env,fluidSimClass,"density","[Ljava/nio/ByteBuffer;");
jfieldID d0JId = (*env)->GetFieldID(env,fluidSimClass,"densityAddition","[Ljava/nio/ByteBuffer;");
jfieldID uJId = (*env)->GetFieldID(env,fluidSimClass,"uVector","[Ljava/nio/ByteBuffer;");
jfieldID vJId = (*env)->GetFieldID(env,fluidSimClass,"vVector","[Ljava/nio/ByteBuffer;");
jfieldID wJId = (*env)->GetFieldID(env,fluidSimClass,"wVector","[Ljava/nio/ByteBuffer;");
jfieldID u0JId = (*env)->GetFieldID(env,fluidSimClass,"uAdditionVector","[Ljava/nio/ByteBuffer;");
jfieldID v0JId = (*env)->GetFieldID(env,fluidSimClass,"vAdditionVector","[Ljava/nio/ByteBuffer;");
jfieldID w0JId = (*env)->GetFieldID(env,fluidSimClass,"wAdditionVector","[Ljava/nio/ByteBuffer;");
jfieldID chunkmaskJId = (*env)->GetFieldID(env,fluidSimClass,"chunkMask","I");
//the number of chunks
int numChunks = (*env)->CallIntMethod(env,chunkList,jListSize);
//current chunk (this)
jobject chunkJRaw;
//current chunk fields
jobjectArray jd;
jobjectArray jd0;
jobjectArray u;
jobjectArray v;
jobjectArray w;
jobjectArray u0;
jobjectArray v0;
jobjectArray w0;
int chunkMask;
//solve chunk mask
for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i);
chunkMask = Java_electrosphere_FluidSim_calculateChunkMask(env,chunkJRaw,getBuffArr(dJId));
(*env)->SetIntField(env,chunkJRaw,chunkmaskJId,chunkMask);
Chunk * newChunk;
if(i >= stbds_arrlen(chunks)){
// printf("allocate chunk %d\n",i);
// fflush(stdout);
newChunk = (Chunk *)malloc(sizeof(Chunk));
// printf("new chunk %p\n",newChunk);
// fflush(stdout);
stbds_arrput(chunks,newChunk);
// printf("new chunk %p\n",chunks[i]);
// fflush(stdout);
} else {
newChunk = chunks[i];
// printf("get chunk %d: %p\n",i,newChunk);
// fflush(stdout);
}
jd = (*env)->GetObjectField(env,chunkJRaw,dJId);
jd0 = (*env)->GetObjectField(env,chunkJRaw,d0JId);
u = (*env)->GetObjectField(env,chunkJRaw,uJId);
v = (*env)->GetObjectField(env,chunkJRaw,vJId);
w = (*env)->GetObjectField(env,chunkJRaw,wJId);
u0 = (*env)->GetObjectField(env,chunkJRaw,u0JId);
v0 = (*env)->GetObjectField(env,chunkJRaw,v0JId);
w0 = (*env)->GetObjectField(env,chunkJRaw,w0JId);
newChunk->chunkMask = chunkMask;
for(int j = 0; j < 27; j++){
if((chunkMask & CHUNK_INDEX_ARR[j]) > 0){
newChunk->d[j] = GET_ARR(env,jd,j);
newChunk->d0[j] = GET_ARR(env,jd0,j);
newChunk->u[j] = GET_ARR(env,u,j);
newChunk->v[j] = GET_ARR(env,v,j);
newChunk->w[j] = GET_ARR(env,w,j);
newChunk->u0[j] = GET_ARR(env,u0,j);
newChunk->v0[j] = GET_ARR(env,v0,j);
newChunk->w0[j] = GET_ARR(env,w0,j);
}
}
// for(int j = 0; j < 27; j++){
// newChunk.d[j] = GET_ARR(env,d,j);
// }
// chunks[i].d0 = getBuffArr(d0JId);
// chunks[i].u = getBuffArr(uJId);
// chunks[i].v = getBuffArr(vJId);
// chunks[i].w = getBuffArr(wJId);
// chunks[i].u0 = getBuffArr(u0JId);
// chunks[i].v0 = getBuffArr(v0JId);
// chunks[i].w0 = getBuffArr(w0JId);
}
// printf("%p\n",chunks[0].d); // printf("%p\n",chunks[0].d);
saveStep(chunks[0]->u[CENTER_LOC], "./chunks/beginU"); saveStep(chunks[0]->u[CENTER_LOC], "./chunks/beginU");
@ -155,10 +47,9 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//solve chunk mask //solve chunk mask
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask;
addSourceToVectors( addSourceToVectors(
DIM, DIM,
chunkMask, currentChunk->chunkMask,
currentChunk->u, currentChunk->u,
currentChunk->v, currentChunk->v,
currentChunk->w, currentChunk->w,
@ -181,7 +72,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];
chunkMask = currentChunk->chunkMask;
float * tmpArr; float * tmpArr;
for(int j = 0; j < 27; j++){ for(int j = 0; j < 27; j++){
@ -203,13 +93,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//copy neighbors //copy neighbors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0);
} }
} }
saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swapU"); saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swapU");
@ -228,8 +117,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//solve vector diffusion //solve vector diffusion
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; solveVectorDiffuse(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
solveVectorDiffuse(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
if(SAVE_STEPS){ if(SAVE_STEPS){
sprintf(fileNameBuff, "./chunks/diffuseUStep%dx", l); sprintf(fileNameBuff, "./chunks/diffuseUStep%dx", l);
@ -248,19 +136,18 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//update array for vectors //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w);
// setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); // setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0);
// setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); // setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0);
// setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); // setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->w0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->w0);
} }
if(SAVE_STEPS){ if(SAVE_STEPS){
sprintf(fileNameBuff, "./chunks/diffuseUStep%dxBnd", l); sprintf(fileNameBuff, "./chunks/diffuseUStep%dxBnd", l);
@ -289,23 +176,21 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//update array for vectors //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask;
// setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); // setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u);
// setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); // setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v);
// setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); // setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w);
// setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); // setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0);
// setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); // setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
} }
//setup projection //setup projection
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setupProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
setupProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1Div"); saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1Div");
@ -314,11 +199,10 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//update array for vectors //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->u0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->v0);
setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->v0);
} }
saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1DivBnd"); saveStep(chunks[0]->v0[CENTER_LOC], "./chunks/setupProj1DivBnd");
@ -332,8 +216,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int l = 0; l < LINEARSOLVERTIMES; l++){
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; solveProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
solveProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
if(SAVE_STEPS){ if(SAVE_STEPS){
sprintf(fileNameBuff, "./chunks/proj1Step%dx", l); sprintf(fileNameBuff, "./chunks/proj1Step%dx", l);
@ -343,9 +226,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
} }
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0);
} }
if(SAVE_STEPS){ if(SAVE_STEPS){
sprintf(fileNameBuff, "./chunks/proj1Step%dxBnd", l); sprintf(fileNameBuff, "./chunks/proj1Step%dxBnd", l);
@ -359,8 +241,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//Finalize projection //Finalize projection
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; finalizeProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
finalizeProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
saveStep(chunks[0]->u[CENTER_LOC], "./chunks/finalizeProj1U"); saveStep(chunks[0]->u[CENTER_LOC], "./chunks/finalizeProj1U");
@ -371,19 +252,18 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//... //...
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w0);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0);
} }
} }
saveStep(chunks[0]->u[CENTER_LOC], "./chunks/projU"); saveStep(chunks[0]->u[CENTER_LOC], "./chunks/projU");
@ -398,7 +278,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];
chunkMask = currentChunk->chunkMask;
float * tmpArr; float * tmpArr;
for(int j = 0; j < 27; j++){ for(int j = 0; j < 27; j++){
@ -420,13 +299,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//copy neighbors //copy neighbors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0);
} }
} }
saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swap2U"); saveStep(chunks[0]->u[CENTER_LOC], "./chunks/swap2U");
@ -440,36 +318,33 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//update border arrs //update border arrs
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w0);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0);
} }
//advect //advect
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; advectVectors(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
advectVectors(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
//update neighbor arr //update neighbor arr
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w);
} }
} }
saveStep(chunks[0]->u[CENTER_LOC], "./chunks/advectU"); saveStep(chunks[0]->u[CENTER_LOC], "./chunks/advectU");
@ -483,32 +358,29 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//update array for vectors //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0);
} }
//setup projection //setup projection
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setupProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
setupProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
//update array for vectors //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0);
} }
//samples u0, v0 //samples u0, v0
//sets u0 //sets u0
@ -518,14 +390,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int l = 0; l < LINEARSOLVERTIMES; l++){
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; solveProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
solveProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,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];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->u0);
} }
} }
//samples u,v,w,u0 //samples u,v,w,u0
@ -533,26 +403,24 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
//Finalize projection //Finalize projection
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; finalizeProjection(DIM,currentChunk->chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
finalizeProjection(DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
//set boundaries a final time for u,v,w //set boundaries a final time for u,v,w
//... //...
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,1,currentChunk->u0);
setBoundsToNeighborsRaw(DIM,chunkMask,1,currentChunk->u0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,2,currentChunk->v0);
setBoundsToNeighborsRaw(DIM,chunkMask,2,currentChunk->v0); setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,3,currentChunk->w0);
setBoundsToNeighborsRaw(DIM,chunkMask,3,currentChunk->w0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,1,currentChunk->u0);
copyNeighborsRaw(DIM,chunkMask,0,1,currentChunk->u0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,2,currentChunk->v0);
copyNeighborsRaw(DIM,chunkMask,0,2,currentChunk->v0); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,3,currentChunk->w0);
copyNeighborsRaw(DIM,chunkMask,0,3,currentChunk->w0);
} }
} }
@ -572,8 +440,7 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
{ {
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; addDensity(DIM,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,timestep);
addDensity(DIM,chunkMask,currentChunk->d,currentChunk->d0,timestep);
} }
} }
//swap all density arrays //swap all density arrays
@ -591,9 +458,8 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
} }
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d0);
} }
} }
//diffuse density //diffuse density
@ -601,13 +467,11 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int l = 0; l < LINEARSOLVERTIMES; l++){
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; solveDiffuseDensity(DIM,currentChunk->chunkMask,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
solveDiffuseDensity(DIM,chunkMask,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->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];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->d);
setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->d);
} }
} }
} }
@ -625,25 +489,22 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
} }
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d); copyNeighborsRaw(DIM,currentChunk->chunkMask,0,0,currentChunk->d0);
copyNeighborsRaw(DIM,chunkMask,0,0,currentChunk->d0);
} }
} }
//advect density //advect density
{ {
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; advectDensity(currentChunk->chunkMask,DIM,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,timestep);
advectDensity(chunkMask,DIM,currentChunk->d,currentChunk->d0,currentChunk->u,currentChunk->v,currentChunk->w,timestep);
} }
} }
//mirror densities //mirror densities
{ {
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
Chunk * currentChunk = chunks[i]; Chunk * currentChunk = chunks[i];
chunkMask = currentChunk->chunkMask; setBoundsToNeighborsRaw(DIM,currentChunk->chunkMask,0,currentChunk->d);
setBoundsToNeighborsRaw(DIM,chunkMask,0,currentChunk->d);
} }
} }
} }

View File

@ -0,0 +1,19 @@
#ifndef CHUNK_H
#define CHUNK_H
/**
* A chunk
*/
typedef struct {
float * d[27];
float * d0[27];
float * u[27];
float * v[27];
float * w[27];
float * u0[27];
float * v0[27];
float * w0[27];
int chunkMask;
} Chunk;
#endif

View File

@ -3,13 +3,9 @@
#include <jni.h> #include <jni.h>
/* #include "./chunk.h"
* Class: electrosphere_FluidSim
* Method: calculateChunkMask void simulate(int numChunks, Chunk ** passedInChunks, jfloat timestep);
* Signature: ([Ljava/nio/ByteBuffer;)I
*/
JNIEXPORT jint JNICALL Java_electrosphere_FluidSim_calculateChunkMask
(JNIEnv *, jobject, jobjectArray);
/* /*
* Class: electrosphere_FluidSim * Class: electrosphere_FluidSim

169
src/main/c/javainterface.c Normal file
View File

@ -0,0 +1,169 @@
#include <jni.h>
//library includes
//include stb ds
#define STB_DS_IMPLEMENTATION
#include "./lib/stb/stb_ds.h"
//local includes
#include "./includes/chunk.h"
#include "./includes/chunkmask.h"
#include "./includes/mainFunctions.h"
#include "./includes/utilities.h"
//defines
//function defines
#define getChunk(i) (*env)->CallObjectMethod(env,chunkList,jListGet,i)
#define getBuffArr(buffId) (*env)->GetObjectField(env,chunkJRaw,buffId)
#define setBuffArr(buffId,value) (*env)->SetObjectField(env,chunkJRaw,buffId,value)
//declarations
void readInChunks(JNIEnv * env, jobject chunkList);
int calculateChunkMask(JNIEnv * env, jobjectArray jrx);
uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx);
//the list of chunks
Chunk ** javaChunkView = NULL;
//the number of chunks
int numChunks = 0;
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
JNIEnv * env,
jclass fluidSimClass,
jobject chunkList,
jfloat dt
){
readInChunks(env,chunkList);
simulate(numChunks,javaChunkView,dt);
}
/**
* Reads chunks into the dynamic array
*/
void readInChunks(JNIEnv * env, jobject chunkList){
jclass listClass = (*env)->FindClass(env,"java/util/List");
jclass fluidSimClass = (*env)->FindClass(env,"electrosphere/FluidSim");
//JNIEnv *env, jclass clazz, const char *name, const char *sig
jmethodID jListSize = (*env)->GetMethodID(env, listClass, "size", "()I");
jmethodID jListGet = (*env)->GetMethodID(env, listClass, "get", "(I)Ljava/lang/Object;");
jmethodID jListAdd = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
//ByteBuffer[]
jfieldID dJId = (*env)->GetFieldID(env,fluidSimClass,"density","[Ljava/nio/ByteBuffer;");
jfieldID d0JId = (*env)->GetFieldID(env,fluidSimClass,"densityAddition","[Ljava/nio/ByteBuffer;");
jfieldID uJId = (*env)->GetFieldID(env,fluidSimClass,"uVector","[Ljava/nio/ByteBuffer;");
jfieldID vJId = (*env)->GetFieldID(env,fluidSimClass,"vVector","[Ljava/nio/ByteBuffer;");
jfieldID wJId = (*env)->GetFieldID(env,fluidSimClass,"wVector","[Ljava/nio/ByteBuffer;");
jfieldID u0JId = (*env)->GetFieldID(env,fluidSimClass,"uAdditionVector","[Ljava/nio/ByteBuffer;");
jfieldID v0JId = (*env)->GetFieldID(env,fluidSimClass,"vAdditionVector","[Ljava/nio/ByteBuffer;");
jfieldID w0JId = (*env)->GetFieldID(env,fluidSimClass,"wAdditionVector","[Ljava/nio/ByteBuffer;");
jfieldID chunkmaskJId = (*env)->GetFieldID(env,fluidSimClass,"chunkMask","I");
//the number of chunks
numChunks = (*env)->CallIntMethod(env,chunkList,jListSize);
//current chunk (this)
jobject chunkJRaw;
//current chunk fields
jobjectArray jd;
jobjectArray jd0;
jobjectArray u;
jobjectArray v;
jobjectArray w;
jobjectArray u0;
jobjectArray v0;
jobjectArray w0;
int chunkMask;
//solve chunk mask
for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i);
chunkMask = calculateChunkMask(env,getBuffArr(dJId));
(*env)->SetIntField(env,chunkJRaw,chunkmaskJId,chunkMask);
Chunk * newChunk;
if(i >= stbds_arrlen(javaChunkView)){
// printf("allocate chunk %d\n",i);
// fflush(stdout);
newChunk = (Chunk *)malloc(sizeof(Chunk));
// printf("new chunk %p\n",newChunk);
// fflush(stdout);
stbds_arrput(javaChunkView,newChunk);
// printf("new chunk %p\n",chunks[i]);
// fflush(stdout);
} else {
newChunk = javaChunkView[i];
// printf("get chunk %d: %p\n",i,newChunk);
// fflush(stdout);
}
jd = (*env)->GetObjectField(env,chunkJRaw,dJId);
jd0 = (*env)->GetObjectField(env,chunkJRaw,d0JId);
u = (*env)->GetObjectField(env,chunkJRaw,uJId);
v = (*env)->GetObjectField(env,chunkJRaw,vJId);
w = (*env)->GetObjectField(env,chunkJRaw,wJId);
u0 = (*env)->GetObjectField(env,chunkJRaw,u0JId);
v0 = (*env)->GetObjectField(env,chunkJRaw,v0JId);
w0 = (*env)->GetObjectField(env,chunkJRaw,w0JId);
newChunk->chunkMask = chunkMask;
for(int j = 0; j < 27; j++){
if((chunkMask & CHUNK_INDEX_ARR[j]) > 0){
newChunk->d[j] = GET_ARR(env,jd,j);
newChunk->d0[j] = GET_ARR(env,jd0,j);
newChunk->u[j] = GET_ARR(env,u,j);
newChunk->v[j] = GET_ARR(env,v,j);
newChunk->w[j] = GET_ARR(env,w,j);
newChunk->u0[j] = GET_ARR(env,u0,j);
newChunk->v0[j] = GET_ARR(env,v0,j);
newChunk->w0[j] = GET_ARR(env,w0,j);
}
}
}
}
/**
* Calculates the bitmask for available chunks for the provided chunk's neighbor array
*/
int calculateChunkMask(JNIEnv * env, jobjectArray jrx){
return matrix_transform(env,jrx);
}
/**
* Calculates a mask that represents all nearby chunks that are actually accessible and exist
*/
uint32_t matrix_transform(JNIEnv * env, jobjectArray jrx){
//The returned value, an availability mask that contains the availability of each neighbor chunk
uint32_t rVal = 0;
//Add to maks for initial chunks
for(int i = 0; i < CENTER_LOC; i++){
if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){
rVal = rVal + 1;
}
rVal = rVal << 1;
}
//add 1 for center chunk because we already have that
rVal = rVal + 1;
rVal = rVal << 1;
//continue on for remaining chunks
for(int i = CENTER_LOC+1; i < 27; i++){
if((*env)->GetObjectArrayElement(env,jrx,i)!=NULL){
rVal = rVal + 1;
}
if(i < 26){
rVal = rVal << 1;
}
}
return rVal;
}