neighbor operations use raw arrays
This commit is contained in:
parent
79fa7715f0
commit
f93936a96e
@ -261,12 +261,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
|
|||||||
u0 = currentChunk->ju0;
|
u0 = currentChunk->ju0;
|
||||||
v0 = currentChunk->jv0;
|
v0 = currentChunk->jv0;
|
||||||
w0 = currentChunk->jw0;
|
w0 = currentChunk->jw0;
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v0);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//solve vector diffusion
|
//solve vector diffusion
|
||||||
@ -300,129 +300,18 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
|
|||||||
u0 = currentChunk->ju0;
|
u0 = currentChunk->ju0;
|
||||||
v0 = currentChunk->jv0;
|
v0 = currentChunk->jv0;
|
||||||
w0 = currentChunk->jw0;
|
w0 = currentChunk->jw0;
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u);
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v);
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//solve projection
|
//solve projection
|
||||||
{
|
{
|
||||||
//update array for vectors
|
//update array for vectors
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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);
|
|
||||||
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++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//update array for vectors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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);
|
|
||||||
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++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = currentChunk->jd0;
|
|
||||||
u = currentChunk->ju;
|
|
||||||
v = currentChunk->jv;
|
|
||||||
w = currentChunk->jw;
|
|
||||||
u0 = currentChunk->ju0;
|
|
||||||
v0 = currentChunk->jv0;
|
|
||||||
w0 = currentChunk->jw0;
|
|
||||||
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
|
||||||
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//samples u,v,w,u0
|
|
||||||
//sets u,v,w
|
|
||||||
//Finalize projection
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//set boundaries a final time for u,v,w
|
|
||||||
//...
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
for(int i = 0; i < numChunks; i++){
|
||||||
Chunk * currentChunk = chunks[i];
|
Chunk * currentChunk = chunks[i];
|
||||||
chunkJRaw = currentChunk->jchunk;
|
chunkJRaw = currentChunk->jchunk;
|
||||||
@ -440,179 +329,11 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
|
|||||||
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
||||||
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
||||||
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0);
|
||||||
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v0);
|
||||||
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++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = currentChunk->jd0;
|
|
||||||
u = currentChunk->ju;
|
|
||||||
v = currentChunk->jv;
|
|
||||||
w = currentChunk->jw;
|
|
||||||
u0 = currentChunk->ju0;
|
|
||||||
v0 = currentChunk->jv0;
|
|
||||||
w0 = currentChunk->jw0;
|
|
||||||
setBuffArr(uJId,u0);
|
|
||||||
setBuffArr(u0JId,u);
|
|
||||||
|
|
||||||
setBuffArr(vJId,v0);
|
|
||||||
setBuffArr(v0JId,v);
|
|
||||||
|
|
||||||
setBuffArr(wJId,w0);
|
|
||||||
setBuffArr(w0JId,w);
|
|
||||||
|
|
||||||
jobject tmpObj;
|
|
||||||
tmpObj = currentChunk->ju;
|
|
||||||
currentChunk->ju = currentChunk->ju0;
|
|
||||||
currentChunk->ju0 = u;
|
|
||||||
|
|
||||||
tmpObj = currentChunk->jv;
|
|
||||||
currentChunk->jv = currentChunk->jv0;
|
|
||||||
currentChunk->jv0 = v;
|
|
||||||
|
|
||||||
tmpObj = currentChunk->jw;
|
|
||||||
currentChunk->jw = currentChunk->jw0;
|
|
||||||
currentChunk->jw0 = w;
|
|
||||||
|
|
||||||
float * tmpArr;
|
|
||||||
for(int j = 0; j < 27; j++){
|
|
||||||
tmpArr = currentChunk->u[j];
|
|
||||||
currentChunk->u[j] = currentChunk->u0[j];
|
|
||||||
currentChunk->u0[j] = tmpArr;
|
|
||||||
}
|
|
||||||
for(int j = 0; j < 27; j++){
|
|
||||||
tmpArr = currentChunk->v[j];
|
|
||||||
currentChunk->v[j] = currentChunk->v0[j];
|
|
||||||
currentChunk->v0[j] = tmpArr;
|
|
||||||
}
|
|
||||||
for(int j = 0; j < 27; j++){
|
|
||||||
tmpArr = currentChunk->w[j];
|
|
||||||
currentChunk->w[j] = currentChunk->w0[j];
|
|
||||||
currentChunk->w0[j] = tmpArr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//copy neighbors
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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);
|
|
||||||
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++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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);
|
|
||||||
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++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = currentChunk->jd0;
|
|
||||||
u = currentChunk->ju;
|
|
||||||
v = currentChunk->jv;
|
|
||||||
w = currentChunk->jw;
|
|
||||||
u0 = currentChunk->ju0;
|
|
||||||
v0 = currentChunk->jv0;
|
|
||||||
w0 = currentChunk->jw0;
|
|
||||||
Java_electrosphere_FluidSim_advectVectors(env,chunkJRaw,DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
|
||||||
}
|
|
||||||
//update neighbor arr
|
|
||||||
for(int i = 0; i < numChunks; i++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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);
|
|
||||||
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++){
|
|
||||||
Chunk * currentChunk = chunks[i];
|
|
||||||
chunkJRaw = currentChunk->jchunk;
|
|
||||||
chunkMask = currentChunk->chunkMask;
|
|
||||||
jd = currentChunk->jd;
|
|
||||||
jd0 = 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);
|
|
||||||
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
|
//setup projection
|
||||||
for(int i = 0; i < numChunks; i++){
|
for(int i = 0; i < numChunks; i++){
|
||||||
@ -714,18 +435,297 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate(
|
|||||||
u0 = currentChunk->ju0;
|
u0 = currentChunk->ju0;
|
||||||
v0 = currentChunk->jv0;
|
v0 = currentChunk->jv0;
|
||||||
w0 = currentChunk->jw0;
|
w0 = currentChunk->jw0;
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u);
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v);
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,1,u0);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,2,v0);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0);
|
||||||
Java_electrosphere_FluidSim_setBoundsToNeighbors(env,chunkJRaw,DIM,chunkMask,3,w0);
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w0);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,1,u0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,2,v0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v0);
|
||||||
Java_electrosphere_FluidSim_copyNeighbors(env,chunkJRaw,DIM,chunkMask,0,3,w0);
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//swap all vector fields
|
||||||
|
{
|
||||||
|
//swap vector fields
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
setBuffArr(uJId,u0);
|
||||||
|
setBuffArr(u0JId,u);
|
||||||
|
|
||||||
|
setBuffArr(vJId,v0);
|
||||||
|
setBuffArr(v0JId,v);
|
||||||
|
|
||||||
|
setBuffArr(wJId,w0);
|
||||||
|
setBuffArr(w0JId,w);
|
||||||
|
|
||||||
|
jobject tmpObj;
|
||||||
|
tmpObj = currentChunk->ju;
|
||||||
|
currentChunk->ju = currentChunk->ju0;
|
||||||
|
currentChunk->ju0 = u;
|
||||||
|
|
||||||
|
tmpObj = currentChunk->jv;
|
||||||
|
currentChunk->jv = currentChunk->jv0;
|
||||||
|
currentChunk->jv0 = v;
|
||||||
|
|
||||||
|
tmpObj = currentChunk->jw;
|
||||||
|
currentChunk->jw = currentChunk->jw0;
|
||||||
|
currentChunk->jw0 = w;
|
||||||
|
|
||||||
|
float * tmpArr;
|
||||||
|
for(int j = 0; j < 27; j++){
|
||||||
|
tmpArr = currentChunk->u[j];
|
||||||
|
currentChunk->u[j] = currentChunk->u0[j];
|
||||||
|
currentChunk->u0[j] = tmpArr;
|
||||||
|
}
|
||||||
|
for(int j = 0; j < 27; j++){
|
||||||
|
tmpArr = currentChunk->v[j];
|
||||||
|
currentChunk->v[j] = currentChunk->v0[j];
|
||||||
|
currentChunk->v0[j] = tmpArr;
|
||||||
|
}
|
||||||
|
for(int j = 0; j < 27; j++){
|
||||||
|
tmpArr = currentChunk->w[j];
|
||||||
|
currentChunk->w[j] = currentChunk->w0[j];
|
||||||
|
currentChunk->w0[j] = tmpArr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//copy neighbors
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//advect vectors across boundaries
|
||||||
|
{
|
||||||
|
//update border arrs
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w0);
|
||||||
|
}
|
||||||
|
//advect
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
Java_electrosphere_FluidSim_advectVectors(env,chunkJRaw,DIM,chunkMask,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
||||||
|
}
|
||||||
|
//update neighbor arr
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//solve projection
|
||||||
|
{
|
||||||
|
//update array for vectors
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v0);
|
||||||
|
}
|
||||||
|
//setup projection
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = 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,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
||||||
|
}
|
||||||
|
//update array for vectors
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->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++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = 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,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//samples u,v,w,u0
|
||||||
|
//sets u,v,w
|
||||||
|
//Finalize projection
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = 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,currentChunk->u,currentChunk->v,currentChunk->w,currentChunk->u0,currentChunk->v0,currentChunk->w0,DIFFUSION_CONSTANT,VISCOSITY_CONSTANT,timestep);
|
||||||
|
}
|
||||||
|
//set boundaries a final time for u,v,w
|
||||||
|
//...
|
||||||
|
for(int i = 0; i < numChunks; i++){
|
||||||
|
Chunk * currentChunk = chunks[i];
|
||||||
|
chunkJRaw = currentChunk->jchunk;
|
||||||
|
chunkMask = currentChunk->chunkMask;
|
||||||
|
jd = currentChunk->jd;
|
||||||
|
jd0 = currentChunk->jd0;
|
||||||
|
u = currentChunk->ju;
|
||||||
|
v = currentChunk->jv;
|
||||||
|
w = currentChunk->jw;
|
||||||
|
u0 = currentChunk->ju0;
|
||||||
|
v0 = currentChunk->jv0;
|
||||||
|
w0 = currentChunk->jw0;
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,1,currentChunk->u0);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0);
|
||||||
|
setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->w0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,1,currentChunk->u0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,2,currentChunk->v0);
|
||||||
|
copyNeighborsRaw(env,chunkJRaw,DIM,chunkMask,0,3,currentChunk->w0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -83,14 +83,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_solveDiffuseDensity
|
|||||||
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_advectDensity
|
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_advectDensity
|
||||||
(JNIEnv *, jobject, jint, jint, float **, float **, float **, float **, float **, jfloat, jfloat, jfloat);
|
(JNIEnv *, jobject, jint, jint, float **, float **, float **, float **, float **, jfloat, jfloat, jfloat);
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: electrosphere_FluidSim
|
|
||||||
* Method: setBoundsToNeighbors
|
|
||||||
* Signature: (III[Ljava/nio/ByteBuffer;)V
|
|
||||||
*/
|
|
||||||
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_setBoundsToNeighbors
|
|
||||||
(JNIEnv *, jobject, jint, jint, jint, jobjectArray);
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL setBoundsToNeighborsRaw
|
JNIEXPORT void JNICALL setBoundsToNeighborsRaw
|
||||||
(JNIEnv * env,
|
(JNIEnv * env,
|
||||||
jobject this,
|
jobject this,
|
||||||
@ -99,14 +91,6 @@ JNIEXPORT void JNICALL setBoundsToNeighborsRaw
|
|||||||
jint vector_dir,
|
jint vector_dir,
|
||||||
float ** neighborArray);
|
float ** neighborArray);
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: electrosphere_FluidSim
|
|
||||||
* Method: copyNeighbors
|
|
||||||
* Signature: (IIII[Ljava/nio/ByteBuffer;)V
|
|
||||||
*/
|
|
||||||
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_copyNeighbors
|
|
||||||
(JNIEnv *, jobject, jint, jint, jint, jint, jobjectArray);
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL copyNeighborsRaw
|
JNIEXPORT void JNICALL copyNeighborsRaw
|
||||||
(JNIEnv * env,
|
(JNIEnv * env,
|
||||||
jobject this,
|
jobject this,
|
||||||
|
|||||||
@ -725,62 +725,6 @@ JNIEXPORT void JNICALL setBoundsToNeighborsRaw
|
|||||||
target[IX(DIM-1,DIM-1,DIM-1)] = (float)((target[IX(DIM-1,DIM-1,DIM-2)]+target[IX(DIM-1,DIM-2,DIM-1)]+target[IX(DIM-1,DIM-1,DIM-2)])/3.0);
|
target[IX(DIM-1,DIM-1,DIM-1)] = (float)((target[IX(DIM-1,DIM-1,DIM-2)]+target[IX(DIM-1,DIM-2,DIM-1)]+target[IX(DIM-1,DIM-1,DIM-2)])/3.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_setBoundsToNeighbors
|
|
||||||
(JNIEnv * env,
|
|
||||||
jobject this,
|
|
||||||
jint N,
|
|
||||||
jint chunk_mask,
|
|
||||||
jint vector_dir,
|
|
||||||
jobjectArray neighborArray){
|
|
||||||
int DIM = N;
|
|
||||||
float * target = GET_ARR(env,neighborArray,CENTER_LOC);
|
|
||||||
float * source;
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(0,x,y)] = vector_dir==BOUND_DIR_U ? -target[IX(1,x,y)] : target[IX(1,x,y)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(DIM-1,x,y)] = vector_dir==BOUND_DIR_U ? -target[IX(DIM-2,x,y)] : target[IX(DIM-2,x,y)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
//((x)+(DIM)*(y) + (DIM)*(DIM)*(z))
|
|
||||||
target[IX(x,0,y)] = vector_dir==BOUND_DIR_V ? -target[IX(x,1,y)] : target[IX(x,1,y)];
|
|
||||||
target[IX(x,DIM-1,y)] = vector_dir==BOUND_DIR_V ? -target[IX(x,DIM-2,y)] : target[IX(x,DIM-2,y)];
|
|
||||||
target[IX(x,y,0)] = vector_dir==BOUND_DIR_W ? -target[IX(x,y,1)] : target[IX(x,y,1)];
|
|
||||||
target[IX(x,y,DIM-1)] = vector_dir==BOUND_DIR_W ? -target[IX(x,y,DIM-2)] : target[IX(x,y,DIM-2)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(int x = 1; x < DIM-1; x++){
|
|
||||||
target[IX(x,0,0)] = (float)(0.5f * (target[IX(x,1,0)] + target[IX(x,0,1)]));
|
|
||||||
target[IX(x,DIM-1,0)] = (float)(0.5f * (target[IX(x,DIM-2,0)] + target[IX(x,DIM-1,1)]));
|
|
||||||
target[IX(x,0,DIM-1)] = (float)(0.5f * (target[IX(x,1,DIM-1)] + target[IX(x,0,DIM-2)]));
|
|
||||||
target[IX(x,DIM-1,DIM-1)] = (float)(0.5f * (target[IX(x,DIM-2,DIM-1)] + target[IX(x,DIM-1,DIM-2)]));
|
|
||||||
|
|
||||||
target[IX(0,x,0)] = (float)(0.5f * (target[IX(1,x,0)] + target[IX(0,x,1)]));
|
|
||||||
target[IX(DIM-1,x,0)] = (float)(0.5f * (target[IX(DIM-2,x,0)] + target[IX(DIM-1,x,1)]));
|
|
||||||
target[IX(0,x,DIM-1)] = (float)(0.5f * (target[IX(1,x,DIM-1)] + target[IX(0,x,DIM-2)]));
|
|
||||||
target[IX(DIM-1,x,DIM-1)] = (float)(0.5f * (target[IX(DIM-2,x,DIM-1)] + target[IX(DIM-1,x,DIM-2)]));
|
|
||||||
|
|
||||||
|
|
||||||
target[IX(0,0,x)] = (float)(0.5f * (target[IX(1,0,x)] + target[IX(0,1,x)]));
|
|
||||||
target[IX(DIM-1,0,x)] = (float)(0.5f * (target[IX(DIM-2,0,x)] + target[IX(DIM-1,1,x)]));
|
|
||||||
target[IX(0,DIM-1,x)] = (float)(0.5f * (target[IX(1,DIM-1,x)] + target[IX(0,DIM-2,x)]));
|
|
||||||
target[IX(DIM-1,DIM-1,x)] = (float)(0.5f * (target[IX(DIM-2,DIM-1,x)] + target[IX(DIM-1,DIM-2,x)]));
|
|
||||||
|
|
||||||
}
|
|
||||||
target[IX(0,0,0)] = (float)((target[IX(1,0,0)]+target[IX(0,1,0)]+target[IX(0,0,1)])/3.0);
|
|
||||||
target[IX(DIM-1,0,0)] = (float)((target[IX(DIM-2,0,0)]+target[IX(DIM-1,1,0)]+target[IX(DIM-1,0,1)])/3.0);
|
|
||||||
target[IX(0,DIM-1,0)] = (float)((target[IX(1,DIM-1,0)]+target[IX(0,DIM-2,0)]+target[IX(0,DIM-1,1)])/3.0);
|
|
||||||
target[IX(0,0,DIM-1)] = (float)((target[IX(0,0,DIM-2)]+target[IX(1,0,DIM-1)]+target[IX(0,1,DIM-1)])/3.0);
|
|
||||||
target[IX(DIM-1,DIM-1,0)] = (float)((target[IX(DIM-2,DIM-1,0)]+target[IX(DIM-1,DIM-2,0)]+target[IX(DIM-1,DIM-1,1)])/3.0);
|
|
||||||
target[IX(0,DIM-1,DIM-1)] = (float)((target[IX(1,DIM-1,DIM-1)]+target[IX(0,DIM-2,DIM-1)]+target[IX(0,DIM-1,DIM-2)])/3.0);
|
|
||||||
target[IX(DIM-1,0,DIM-1)] = (float)((target[IX(DIM-1,0,DIM-2)]+target[IX(DIM-2,0,DIM-1)]+target[IX(DIM-1,1,DIM-1)])/3.0);
|
|
||||||
target[IX(DIM-1,DIM-1,DIM-1)] = (float)((target[IX(DIM-1,DIM-1,DIM-2)]+target[IX(DIM-1,DIM-2,DIM-1)]+target[IX(DIM-1,DIM-1,DIM-2)])/3.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This exclusively copies neighbors to make sure zeroing out stuff doesn't break sim
|
* This exclusively copies neighbors to make sure zeroing out stuff doesn't break sim
|
||||||
@ -1006,228 +950,3 @@ JNIEXPORT void JNICALL copyNeighborsRaw
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This exclusively copies neighbors to make sure zeroing out stuff doesn't break sim
|
|
||||||
*/
|
|
||||||
JNIEXPORT void JNICALL Java_electrosphere_FluidSim_copyNeighbors
|
|
||||||
(JNIEnv * env,
|
|
||||||
jobject this,
|
|
||||||
jint N,
|
|
||||||
jint chunk_mask,
|
|
||||||
jint cx,
|
|
||||||
jint vector_dir,
|
|
||||||
jobjectArray neighborArray){
|
|
||||||
int DIM = N;
|
|
||||||
float * target = GET_ARR(env,neighborArray,CENTER_LOC);
|
|
||||||
float * source;
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// PLANES
|
|
||||||
//
|
|
||||||
//
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,1,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,1,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(0,x,y)] = source[IX(DIM-2,x,y)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,1,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,1,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(DIM-1,x,y)] = source[IX(1,x,y)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,0,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,0,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(x,0,y)] = source[IX(x,DIM-2,y)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,2,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,2,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(x,DIM-1,y)] = source[IX(x,1,y)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,1,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,1,0));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(x,y,0)] = source[IX(x,y,DIM-2)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,1,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,1,2));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
for(int y = 1; y < DIM-1; y++){
|
|
||||||
target[IX(x,y,DIM-1)] = source[IX(x,y,1)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// EDGES
|
|
||||||
//
|
|
||||||
//
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,0,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,0,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(0,0,x)] = source[IX(DIM-2,DIM-2,x)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,0,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,0,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(DIM-1,0,x)] = source[IX(1,DIM-2,x)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,2,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,2,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(0,DIM-1,x)] = source[IX(DIM-2,1,x)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,2,1)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,2,1));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(DIM-1,DIM-1,x)] = source[IX(1,1,x)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,1,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,1,0));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(0,x,0)] = source[IX(DIM-2,x,DIM-2)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,1,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,1,0));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(DIM-1,x,0)] = source[IX(1,x,DIM-2)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,1,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,1,2));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(0,x,DIM-1)] = source[IX(DIM-2,x,1)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,1,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,1,2));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(DIM-1,x,DIM-1)] = source[IX(1,x,1)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,0,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,0,0));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(x,0,0)] = source[IX(x,DIM-2,DIM-2)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,2,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,2,0));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(x,DIM-1,0)] = source[IX(x,1,DIM-2)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,0,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,0,2));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(x,0,DIM-1)] = source[IX(x,DIM-2,1)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,1,2,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(1,2,2));
|
|
||||||
for(int x=1; x < DIM-1; x++){
|
|
||||||
target[IX(x,DIM-1,DIM-1)] = source[IX(x,1,1)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// CORNERS
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,0,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,0,0));
|
|
||||||
target[IX(0,0,0)] = source[IX(DIM-2,DIM-2,DIM-2)];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,0,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,0,0));
|
|
||||||
target[IX(DIM-1,0,0)] = source[IX(1,DIM-2,DIM-2)];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,2,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,2,0));
|
|
||||||
target[IX(0,DIM-1,0)] = source[IX(DIM-2,1,DIM-2)];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,2,0)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,2,0));
|
|
||||||
target[IX(DIM-1,DIM-1,0)] = source[IX(1,1,DIM-2)];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,0,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,0,2));
|
|
||||||
target[IX(0,0,DIM-1)] = source[IX(DIM-2,DIM-2,1)];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,0,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,0,2));
|
|
||||||
target[IX(DIM-1,0,DIM-1)] = source[IX(1,DIM-2,1)];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,0,2,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(0,2,2));
|
|
||||||
target[IX(0,DIM-1,DIM-1)] = source[IX(DIM-2,1,1)];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ARR_EXISTS(chunk_mask,2,2,2)){
|
|
||||||
source = GET_ARR(env,neighborArray,CK(2,2,2));
|
|
||||||
target[IX(DIM-1,DIM-1,DIM-1)] = source[IX(1,1,1)];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user