Compare commits
No commits in common. "9021125a740e54c92d427ebdd65119c43097bb45" and "e605a82df6eec1c3f6bf9ac1198d09ed5ede4a16" have entirely different histories.
9021125a74
...
e605a82df6
@ -56,17 +56,12 @@ INPUT_FILES="./chunkmask.c"
|
|||||||
OUTPUT_FILE="./chunkmask.o"
|
OUTPUT_FILE="./chunkmask.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 -O1"
|
|
||||||
INPUT_FILES="./fluidsim.c"
|
|
||||||
OUTPUT_FILE="./fluidsim.o"
|
|
||||||
gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#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="densitystep.o velocitystep.o chunkmask.o fluidsim.o"
|
INPUT_FILES="densitystep.o velocitystep.o chunkmask.o"
|
||||||
gcc $COMPILE_FLAGS $INPUT_FILES -o $OUTPUT_FILE
|
gcc $COMPILE_FLAGS $INPUT_FILES -o $OUTPUT_FILE
|
||||||
|
|
||||||
#move to resources
|
#move to resources
|
||||||
|
|||||||
@ -1,700 +0,0 @@
|
|||||||
#include <jni.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "includes/utilities.h"
|
|
||||||
#include "includes/chunkmask.h"
|
|
||||||
#include "includes/electrosphere_FluidSim.h"
|
|
||||||
|
|
||||||
#define DIM 18
|
|
||||||
#define LINEARSOLVERTIMES 20
|
|
||||||
|
|
||||||
#define DIFFUSION_CONSTANT 0.0
|
|
||||||
#define VISCOSITY_CONSTANT 0.0
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float * d;
|
|
||||||
float * u;
|
|
||||||
float * v;
|
|
||||||
float * w;
|
|
||||||
float * d0;
|
|
||||||
float * u0;
|
|
||||||
float * v0;
|
|
||||||
float * w0;
|
|
||||||
} Chunk;
|
|
||||||
|
|
||||||
#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:
|
|
||||||
//https://stackoverflow.com/questions/39823375/clarification-about-getfieldid
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
|
|
||||||
JNIEnv * env,
|
|
||||||
jclass class,
|
|
||||||
jobject chunkList,
|
|
||||||
jfloat timestep
|
|
||||||
){
|
|
||||||
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
|
|
||||||
int numChunks = (*env)->CallIntMethod(env,chunkList,jListSize);
|
|
||||||
|
|
||||||
//current chunk (this)
|
|
||||||
jobject chunkJRaw;
|
|
||||||
//current chunk fields
|
|
||||||
jobjectArray d;
|
|
||||||
jobjectArray d0;
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
//solve chunk mask
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_addSourceToVectors(
|
|
||||||
env,
|
|
||||||
chunkJRaw,
|
|
||||||
DIM,
|
|
||||||
chunkMask,
|
|
||||||
u,
|
|
||||||
v,
|
|
||||||
w,
|
|
||||||
u0,
|
|
||||||
v0,
|
|
||||||
w0,
|
|
||||||
DIFFUSION_CONSTANT,
|
|
||||||
VISCOSITY_CONSTANT,
|
|
||||||
timestep
|
|
||||||
);
|
|
||||||
}
|
|
||||||
//swap all vector fields
|
|
||||||
{
|
|
||||||
//swap vector fields
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
setBuffArr(uJId,u0);
|
|
||||||
setBuffArr(u0JId,u);
|
|
||||||
|
|
||||||
setBuffArr(vJId,v0);
|
|
||||||
setBuffArr(v0JId,v);
|
|
||||||
|
|
||||||
setBuffArr(wJId,w0);
|
|
||||||
setBuffArr(w0JId,w);
|
|
||||||
}
|
|
||||||
//copy neighbors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//solve vector diffusion
|
|
||||||
{
|
|
||||||
for(int l = 0; l < LINEARSOLVERTIMES; l++){
|
|
||||||
//solve vector diffusion
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_solveVectorDiffuse(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//update array for vectors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//solve projection
|
|
||||||
{
|
|
||||||
//update array for vectors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
}
|
|
||||||
//setup projection
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setupProjection(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//update array for vectors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
}
|
|
||||||
//samples u0, v0
|
|
||||||
//sets u0
|
|
||||||
//these should have just been mirrored in the above
|
|
||||||
//
|
|
||||||
//Perform main projection solver
|
|
||||||
for(int l = 0; l < LINEARSOLVERTIMES; l++){
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_solveProjection(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//samples u,v,w,u0
|
|
||||||
//sets u,v,w
|
|
||||||
//Finalize projection
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_finalizeProjection(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//set boundaries a final time for u,v,w
|
|
||||||
//...
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//swap all vector fields
|
|
||||||
{
|
|
||||||
//swap vector fields
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
setBuffArr(uJId,u0);
|
|
||||||
setBuffArr(u0JId,u);
|
|
||||||
|
|
||||||
setBuffArr(vJId,v0);
|
|
||||||
setBuffArr(v0JId,v);
|
|
||||||
|
|
||||||
setBuffArr(wJId,w0);
|
|
||||||
setBuffArr(w0JId,w);
|
|
||||||
}
|
|
||||||
//copy neighbors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//advect vectors across boundaries
|
|
||||||
{
|
|
||||||
//update border arrs
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w0);
|
|
||||||
}
|
|
||||||
//advect
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_advectVectors(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//update neighbor arr
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//solve projection
|
|
||||||
{
|
|
||||||
//update array for vectors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
}
|
|
||||||
//setup projection
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setupProjection(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//update array for vectors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
}
|
|
||||||
//samples u0, v0
|
|
||||||
//sets u0
|
|
||||||
//these should have just been mirrored in the above
|
|
||||||
//
|
|
||||||
//Perform main projection solver
|
|
||||||
for(int l = 0; l < LINEARSOLVERTIMES; l++){
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_solveProjection(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//samples u,v,w,u0
|
|
||||||
//sets u,v,w
|
|
||||||
//Finalize projection
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_finalizeProjection(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//set boundaries a final time for u,v,w
|
|
||||||
//...
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//add density
|
|
||||||
{
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_addDensity(env,chunkJRaw,DIM,chunkMask,d,d0,timestep);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//swap all density arrays
|
|
||||||
{
|
|
||||||
//swap vector fields
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
setBuffArr(dJId,d0);
|
|
||||||
setBuffArr(d0JId,d);
|
|
||||||
}
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,d);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,d0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//diffuse density
|
|
||||||
{
|
|
||||||
for(int l = 0; l < LINEARSOLVERTIMES; l++){
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_solveDiffuseDensity(env,chunkJRaw,DIM,chunkMask,d,d0,u,v,w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,0,d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//swap all density arrays
|
|
||||||
{
|
|
||||||
//swap vector fields
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
setBuffArr(dJId,d0);
|
|
||||||
setBuffArr(d0JId,d);
|
|
||||||
}
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,d);
|
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,0,d0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//advect density
|
|
||||||
{
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_advectDensity(env,chunkJRaw,DIM,chunkMask,d,d0,u,v,w,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//mirror densities
|
|
||||||
{
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
chunkJRaw = getChunk(i);
|
|
||||||
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId);
|
|
||||||
d = getBuffArr(dJId);
|
|
||||||
d0 = getBuffArr(d0JId);
|
|
||||||
u = getBuffArr(uJId);
|
|
||||||
v = getBuffArr(vJId);
|
|
||||||
w = getBuffArr(wJId);
|
|
||||||
u0 = getBuffArr(u0JId);
|
|
||||||
v0 = getBuffArr(v0JId);
|
|
||||||
w0 = getBuffArr(w0JId);
|
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,0,d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -17,6 +17,14 @@ extern "C" {
|
|||||||
#define electrosphere_FluidSim_LINEARSOLVERTIMES 20L
|
#define electrosphere_FluidSim_LINEARSOLVERTIMES 20L
|
||||||
#undef electrosphere_FluidSim_GRAVITY
|
#undef electrosphere_FluidSim_GRAVITY
|
||||||
#define electrosphere_FluidSim_GRAVITY -100.0f
|
#define electrosphere_FluidSim_GRAVITY -100.0f
|
||||||
|
/*
|
||||||
|
* Class: electrosphere_FluidSim
|
||||||
|
* Method: simulate
|
||||||
|
* Signature: (II[Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;FFF)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate
|
||||||
|
(JNIEnv *, jobject, jint, jint, jobjectArray, jobject, jobjectArray, jobjectArray, jobjectArray, jobjectArray, jobjectArray, jobjectArray, jfloat, jfloat, jfloat);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: electrosphere_FluidSim
|
* Class: electrosphere_FluidSim
|
||||||
* Method: calculateChunkMask
|
* Method: calculateChunkMask
|
||||||
@ -113,14 +121,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_setBoundsToNeighbors
|
|||||||
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);
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: electrosphere_FluidSim
|
|
||||||
* Method: simulate
|
|
||||||
* Signature: (Ljava/util/List;F)V
|
|
||||||
*/
|
|
||||||
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate
|
|
||||||
(JNIEnv *, jclass, jobject, jfloat);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -15,7 +15,6 @@ import org.joml.Vector2i;
|
|||||||
import org.joml.Vector3i;
|
import org.joml.Vector3i;
|
||||||
import org.lwjgl.BufferUtils;
|
import org.lwjgl.BufferUtils;
|
||||||
import org.lwjgl.PointerBuffer;
|
import org.lwjgl.PointerBuffer;
|
||||||
import org.lwjgl.glfw.GLFW;
|
|
||||||
import org.lwjgl.system.MemoryUtil;
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,21 +40,21 @@ public class FluidSim {
|
|||||||
// +-------------+ (2,0,0) +---------------> X
|
// +-------------+ (2,0,0) +---------------> X
|
||||||
|
|
||||||
//Buffers that contain density for current frame
|
//Buffers that contain density for current frame
|
||||||
public ByteBuffer[] density = new ByteBuffer[27];
|
ByteBuffer[] density = new ByteBuffer[27];
|
||||||
//Buffers that contain new density to add to the simulation
|
//Buffers that contain new density to add to the simulation
|
||||||
public ByteBuffer[] densityAddition = new ByteBuffer[27];
|
ByteBuffer[] densityAddition = new ByteBuffer[27];
|
||||||
//Buffers that contain u vector directions
|
//Buffers that contain u vector directions
|
||||||
public ByteBuffer[] uVector = new ByteBuffer[27];
|
ByteBuffer[] uVector = new ByteBuffer[27];
|
||||||
//Buffers that contain v vector directions
|
//Buffers that contain v vector directions
|
||||||
public ByteBuffer[] vVector = new ByteBuffer[27];
|
ByteBuffer[] vVector = new ByteBuffer[27];
|
||||||
//Buffers that contain w vector directions
|
//Buffers that contain w vector directions
|
||||||
public ByteBuffer[] wVector = new ByteBuffer[27];
|
ByteBuffer[] wVector = new ByteBuffer[27];
|
||||||
//Buffers that contain u vector directions to add to the simulation
|
//Buffers that contain u vector directions to add to the simulation
|
||||||
public ByteBuffer[] uAdditionVector = new ByteBuffer[27];
|
ByteBuffer[] uAdditionVector = new ByteBuffer[27];
|
||||||
//Buffers that contain v vector directions to add to the simulation
|
//Buffers that contain v vector directions to add to the simulation
|
||||||
public ByteBuffer[] vAdditionVector = new ByteBuffer[27];
|
ByteBuffer[] vAdditionVector = new ByteBuffer[27];
|
||||||
//Buffers that contain w vector directions to add to the simulation
|
//Buffers that contain w vector directions to add to the simulation
|
||||||
public ByteBuffer[] wAdditionVector = new ByteBuffer[27];
|
ByteBuffer[] wAdditionVector = new ByteBuffer[27];
|
||||||
|
|
||||||
//The densities for every voxel for the current frame
|
//The densities for every voxel for the current frame
|
||||||
float[] densityArrayView = new float[DIM * DIM * DIM];
|
float[] densityArrayView = new float[DIM * DIM * DIM];
|
||||||
@ -70,7 +69,7 @@ public class FluidSim {
|
|||||||
public float[] v0ArrayView = new float[DIM * DIM * DIM];
|
public float[] v0ArrayView = new float[DIM * DIM * DIM];
|
||||||
float[] w0ArrayView = new float[DIM * DIM * DIM];
|
float[] w0ArrayView = new float[DIM * DIM * DIM];
|
||||||
|
|
||||||
public int chunkMask = 0;
|
int chunkMask = 0;
|
||||||
|
|
||||||
|
|
||||||
static final float DIFFUSION_CONSTANT = 0.0f;
|
static final float DIFFUSION_CONSTANT = 0.0f;
|
||||||
@ -155,12 +154,7 @@ public class FluidSim {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int i = 0;
|
|
||||||
static double time = 0;
|
|
||||||
static double lastTime = 0;
|
|
||||||
public static void simChunks(FluidSim[][][] simArray, int step, float timestep){
|
public static void simChunks(FluidSim[][][] simArray, int step, float timestep){
|
||||||
|
|
||||||
List<FluidSim> chunksToSim = new LinkedList<FluidSim>();
|
|
||||||
//
|
//
|
||||||
//init data for upcoming frame
|
//init data for upcoming frame
|
||||||
for(int x = 0; x < simArray.length; x++){
|
for(int x = 0; x < simArray.length; x++){
|
||||||
@ -174,40 +168,29 @@ public class FluidSim {
|
|||||||
//Performs main fluid simulation logic
|
//Performs main fluid simulation logic
|
||||||
//
|
//
|
||||||
simArray[x][y][z].writeNewStateIntoBuffers();
|
simArray[x][y][z].writeNewStateIntoBuffers();
|
||||||
//
|
|
||||||
// add to queue
|
|
||||||
//
|
|
||||||
chunksToSim.add(simArray[x][y][z]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lastTime = GLFW.glfwGetTime();
|
|
||||||
//
|
//
|
||||||
//Vector stage
|
//Vector stage
|
||||||
simulateWrapper(chunksToSim,timestep);
|
solveChunkMask(simArray);
|
||||||
// solveChunkMask(simArray);
|
addVectorSources(simArray, timestep);
|
||||||
// addVectorSources(simArray, timestep);
|
swapAllVectorFields(simArray, timestep);
|
||||||
// swapAllVectorFields(simArray, timestep);
|
solveVectorDiffusion(simArray, timestep);
|
||||||
// solveVectorDiffusion(simArray, timestep);
|
solveProjection(simArray, step, timestep);
|
||||||
// solveProjection(simArray, step, timestep);
|
swapAllVectorFields(simArray, timestep);
|
||||||
// swapAllVectorFields(simArray, timestep);
|
advectVectorsAcrossBoundaries(simArray, timestep);
|
||||||
// advectVectorsAcrossBoundaries(simArray, timestep);
|
solveProjection(simArray, step, timestep);
|
||||||
// solveProjection(simArray, step, timestep);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
//Density stage
|
//Density stage
|
||||||
// addDensity(simArray, timestep);
|
addDensity(simArray, timestep);
|
||||||
// swapAllDensityArrays(simArray, timestep);
|
swapAllDensityArrays(simArray, timestep);
|
||||||
// diffuseDensity(simArray, timestep);
|
diffuseDensity(simArray, timestep);
|
||||||
// swapAllDensityArrays(simArray, timestep);
|
swapAllDensityArrays(simArray, timestep);
|
||||||
// advectDensity(simArray, timestep);
|
advectDensity(simArray, timestep);
|
||||||
// mirrorNeighborDensities(simArray, timestep);
|
// mirrorNeighborDensities(simArray, timestep);
|
||||||
time = time + (GLFW.glfwGetTime() - lastTime);
|
|
||||||
i++;
|
|
||||||
if(i == 100){
|
|
||||||
System.out.println(time / 100.0 * 1000.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -732,38 +715,38 @@ public class FluidSim {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// /**
|
/**
|
||||||
// * The native function call to simulate a frame of fluid
|
* The native function call to simulate a frame of fluid
|
||||||
// * @param DIM_X
|
* @param DIM_X
|
||||||
// * @param DIM_Y
|
* @param DIM_Y
|
||||||
// * @param DIM_Z
|
* @param DIM_Z
|
||||||
// * @param x
|
* @param x
|
||||||
// * @param x0
|
* @param x0
|
||||||
// * @param u
|
* @param u
|
||||||
// * @param v
|
* @param v
|
||||||
// * @param w
|
* @param w
|
||||||
// * @param u0
|
* @param u0
|
||||||
// * @param v0
|
* @param v0
|
||||||
// * @param w0
|
* @param w0
|
||||||
// * @param DIFFUSION_CONSTANT
|
* @param DIFFUSION_CONSTANT
|
||||||
// * @param VISCOSITY_CONSTANT
|
* @param VISCOSITY_CONSTANT
|
||||||
// * @param timestep
|
* @param timestep
|
||||||
// */
|
*/
|
||||||
// private native void simulate(
|
private native void simulate(
|
||||||
// int DIM_X,
|
int DIM_X,
|
||||||
// int chunkMask,
|
int chunkMask,
|
||||||
// ByteBuffer[] x,
|
ByteBuffer[] x,
|
||||||
// ByteBuffer x0,
|
ByteBuffer x0,
|
||||||
// ByteBuffer[] u,
|
ByteBuffer[] u,
|
||||||
// ByteBuffer[] v,
|
ByteBuffer[] v,
|
||||||
// ByteBuffer[] w,
|
ByteBuffer[] w,
|
||||||
// ByteBuffer[] u0,
|
ByteBuffer[] u0,
|
||||||
// ByteBuffer[] v0,
|
ByteBuffer[] v0,
|
||||||
// ByteBuffer[] w0,
|
ByteBuffer[] w0,
|
||||||
// float DIFFUSION_CONSTANT,
|
float DIFFUSION_CONSTANT,
|
||||||
// float VISCOSITY_CONSTANT,
|
float VISCOSITY_CONSTANT,
|
||||||
// float timestep
|
float timestep
|
||||||
// );
|
);
|
||||||
|
|
||||||
private void calculateChunkMaskWrapper(){
|
private void calculateChunkMaskWrapper(){
|
||||||
this.chunkMask = this.calculateChunkMask(density);
|
this.chunkMask = this.calculateChunkMask(density);
|
||||||
@ -870,19 +853,6 @@ public class FluidSim {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main simulation function
|
|
||||||
* @param timestep
|
|
||||||
*/
|
|
||||||
private static void simulateWrapper(List<FluidSim> chunks, float timestep){
|
|
||||||
simulate(chunks,timestep);
|
|
||||||
}
|
|
||||||
private static native void simulate(List<FluidSim> chunks, float timestep);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -71,7 +71,7 @@ public class Main {
|
|||||||
GLFWContext.redraw(meshArray);
|
GLFWContext.redraw(meshArray);
|
||||||
i++;
|
i++;
|
||||||
if(i == 100){
|
if(i == 100){
|
||||||
// System.out.println(time / 100.0);
|
System.out.println(time / 100.0);
|
||||||
}
|
}
|
||||||
if(i > 3){
|
if(i > 3){
|
||||||
// scan.next();
|
// scan.next();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user