Separate java interactions to separate c file
This commit is contained in:
parent
c1d9a7a054
commit
3601e68b83
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
19
src/main/c/includes/chunk.h
Normal file
19
src/main/c/includes/chunk.h
Normal 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
|
||||||
@ -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
169
src/main/c/javainterface.c
Normal 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;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user