#include #include #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); } } }