771 lines
33 KiB
C
771 lines
33 KiB
C
#include <jni.h>
|
|
#include <stdint.h>
|
|
#include "includes/utilities.h"
|
|
#include "includes/chunkmask.h"
|
|
#include "includes/electrosphere_FluidSim.h"
|
|
#include "includes/mainFunctions.h"
|
|
|
|
//include stb ds
|
|
#define STB_DS_IMPLEMENTATION
|
|
#include "./lib/stb/stb_ds.h"
|
|
|
|
#define DIM 18
|
|
#define LINEARSOLVERTIMES 20
|
|
|
|
#define DIFFUSION_CONSTANT 0.0
|
|
#define VISCOSITY_CONSTANT 0.0
|
|
|
|
/**
|
|
* A chunk
|
|
*/
|
|
typedef struct {
|
|
jobject jchunk;
|
|
jobjectArray jd;
|
|
jobjectArray jd0;
|
|
jobjectArray ju;
|
|
jobjectArray jv;
|
|
jobjectArray jw;
|
|
jobjectArray ju0;
|
|
jobjectArray jv0;
|
|
jobjectArray jw0;
|
|
int chunkMask;
|
|
} Chunk;
|
|
|
|
//all chunks
|
|
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:
|
|
//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);
|
|
|
|
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);
|
|
}
|
|
d = (*env)->GetObjectField(env,chunkJRaw,dJId);
|
|
d0 = (*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->jd = d;
|
|
newChunk->jd0 = d0;
|
|
newChunk->ju = u;
|
|
newChunk->jv = v;
|
|
newChunk->jw = w;
|
|
newChunk->ju0 = u0;
|
|
newChunk->jv0 = v0;
|
|
newChunk->jw0 = w0;
|
|
newChunk->jchunk = chunkJRaw;
|
|
newChunk->chunkMask = chunkMask;
|
|
// 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);
|
|
|
|
//solve chunk mask
|
|
for(int i = 0; i < numChunks; i++){
|
|
Chunk * currentChunk = chunks[i];
|
|
chunkJRaw = currentChunk->jchunk;
|
|
chunkMask = currentChunk->chunkMask;
|
|
d = currentChunk->jd;
|
|
d = currentChunk->jd0;
|
|
u = currentChunk->ju;
|
|
v = currentChunk->jv;
|
|
w = currentChunk->jw;
|
|
u0 = currentChunk->ju0;
|
|
v0 = currentChunk->jv0;
|
|
w0 = currentChunk->jw0;
|
|
//old assignments
|
|
// 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);
|
|
}
|
|
}
|
|
} |