first projection correct

This commit is contained in:
unknown 2024-03-10 17:07:35 -04:00
parent f1d3c3d011
commit 2c70036f07

View File

@ -213,16 +213,17 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
} }
//copy neighbors //copy neighbors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); 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,1,u);
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v); 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,3,w);
@ -236,30 +237,32 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int l = 0; l < LINEARSOLVERTIMES; l++){
//solve vector diffusion //solve vector diffusion
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); 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); Java_electrosphere_FluidSim_solveVectorDiffuse(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
//update array for vectors //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u); 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,2,v);
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w); 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 //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u); 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,2,v);
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w); Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
@ -296,30 +300,32 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
} }
//setup projection //setup projection
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); 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); Java_electrosphere_FluidSim_setupProjection(env,chunkJRaw,DIM,chunkMask,u,v,w,u0,v0,w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
} }
//update array for vectors //update array for vectors
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0); 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,2,v0);
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0); 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 //Perform main projection solver
for(int l = 0; l < LINEARSOLVERTIMES; l++){ for(int l = 0; l < LINEARSOLVERTIMES; l++){
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); 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); 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++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0); Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,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 //sets u,v,w
//Finalize projection //Finalize projection
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); 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); 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 //set boundaries a final time for u,v,w
//... //...
for(int i = 0; i < numChunks; i++){ for(int i = 0; i < numChunks; i++){
chunkJRaw = getChunk(i); Chunk * currentChunk = chunks[i];
chunkMask = (*env)->GetIntField(env,chunkJRaw,chunkmaskJId); chunkJRaw = currentChunk->jchunk;
d = getBuffArr(dJId); chunkMask = currentChunk->chunkMask;
d0 = getBuffArr(d0JId); d = currentChunk->jd;
u = getBuffArr(uJId); d0 = currentChunk->jd0;
v = getBuffArr(vJId); u = currentChunk->ju;
w = getBuffArr(wJId); v = currentChunk->jv;
u0 = getBuffArr(u0JId); w = currentChunk->jw;
v0 = getBuffArr(v0JId); u0 = currentChunk->ju0;
w0 = getBuffArr(w0JId); v0 = currentChunk->jv0;
w0 = currentChunk->jw0;
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u); 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,2,v);
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w); Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);