From 2c70036f07f5b165c8fc869d827ad43e65672fe4 Mon Sep 17 00:00:00 2001 From: unknown <> Date: Sun, 10 Mar 2024 17:07:35 -0400 Subject: [PATCH] first projection correct --- src/main/c/fluidsim.c | 210 ++++++++++++++++++++++-------------------- 1 file changed, 110 insertions(+), 100 deletions(-) diff --git a/src/main/c/fluidsim.c b/src/main/c/fluidsim.c index 5e24451..e6f4540 100644 --- a/src/main/c/fluidsim.c +++ b/src/main/c/fluidsim.c @@ -213,16 +213,17 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( } //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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); @@ -236,30 +237,32 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( 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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); @@ -273,16 +276,17 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( { //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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); @@ -296,30 +300,32 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( } //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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); @@ -332,29 +338,31 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0); Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0); } @@ -363,31 +371,33 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( //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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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); + Chunk * currentChunk = chunks[i]; + chunkJRaw = currentChunk->jchunk; + chunkMask = currentChunk->chunkMask; + d = currentChunk->jd; + d0 = currentChunk->jd0; + u = currentChunk->ju; + v = currentChunk->jv; + w = currentChunk->jw; + u0 = currentChunk->ju0; + v0 = currentChunk->jv0; + w0 = currentChunk->jw0; 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);