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