From a004e7e2c322c83a84e09c8f4d329903927595bc Mon Sep 17 00:00:00 2001 From: unknown <> Date: Sun, 10 Mar 2024 16:58:32 -0400 Subject: [PATCH] chunk referencing --- src/main/c/fluidsim.c | 106 +++++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 18 deletions(-) diff --git a/src/main/c/fluidsim.c b/src/main/c/fluidsim.c index 3b2ae41..0462eb7 100644 --- a/src/main/c/fluidsim.c +++ b/src/main/c/fluidsim.c @@ -5,23 +5,35 @@ #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 { - float * d; - float * u; - float * v; - float * w; - float * d0; - float * u0; - float * v0; - float * w0; + 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) @@ -74,20 +86,78 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( 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++){ - 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); + 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,