Performance improvements

This commit is contained in:
unknown 2023-08-04 20:40:05 -04:00
parent 8a67458470
commit 97574dd5a0
4 changed files with 154 additions and 257 deletions

View File

@ -14,7 +14,7 @@ extern "C" {
#undef electrosphere_FluidSim_VISCOSITY_CONSTANT #undef electrosphere_FluidSim_VISCOSITY_CONSTANT
#define electrosphere_FluidSim_VISCOSITY_CONSTANT 0.0f #define electrosphere_FluidSim_VISCOSITY_CONSTANT 0.0f
#undef electrosphere_FluidSim_LINEARSOLVERTIMES #undef electrosphere_FluidSim_LINEARSOLVERTIMES
#define electrosphere_FluidSim_LINEARSOLVERTIMES 20L #define electrosphere_FluidSim_LINEARSOLVERTIMES 10L
#undef electrosphere_FluidSim_GRAVITY #undef electrosphere_FluidSim_GRAVITY
#define electrosphere_FluidSim_GRAVITY -100.0f #define electrosphere_FluidSim_GRAVITY -100.0f
/* /*

View File

@ -196,59 +196,59 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_setupProjection
for(k=1; k<N-1; k++){ for(k=1; k<N-1; k++){
for(j=1; j<N-1; j++){ for(j=1; j<N-1; j++){
// i = 1; i = 1;
// // //
// //lower //lower
// // //
// //first part //first part
// vector = _mm256_loadu_ps(&u[IX(i+1,j,k)]); vector = _mm256_loadu_ps(&u[IX(i+1,j,k)]);
// vector = _mm256_sub_ps(vector,_mm256_loadu_ps(&u[IX(i-1,j,k)])); vector = _mm256_sub_ps(vector,_mm256_loadu_ps(&u[IX(i-1,j,k)]));
// vector = _mm256_div_ps(vector,xVector); vector = _mm256_div_ps(vector,xVector);
// //second part //second part
// vector2 = _mm256_loadu_ps(&v[IX(i,j+1,k)]); vector2 = _mm256_loadu_ps(&v[IX(i,j+1,k)]);
// vector2 = _mm256_sub_ps(vector2,_mm256_loadu_ps(&v[IX(i,j-1,k)])); vector2 = _mm256_sub_ps(vector2,_mm256_loadu_ps(&v[IX(i,j-1,k)]));
// vector2 = _mm256_div_ps(vector2,yVector); vector2 = _mm256_div_ps(vector2,yVector);
// //third part //third part
// vector3 = _mm256_loadu_ps(&w[IX(i,j,k+1)]); vector3 = _mm256_loadu_ps(&w[IX(i,j,k+1)]);
// vector3 = _mm256_sub_ps(vector3,_mm256_loadu_ps(&w[IX(i,j,k-1)])); vector3 = _mm256_sub_ps(vector3,_mm256_loadu_ps(&w[IX(i,j,k-1)]));
// vector3 = _mm256_div_ps(vector3,zVector); vector3 = _mm256_div_ps(vector3,zVector);
// //multiply and finalize //multiply and finalize
// vector = _mm256_add_ps(vector,_mm256_add_ps(vector2,vector3)); vector = _mm256_add_ps(vector,_mm256_add_ps(vector2,vector3));
// vector = _mm256_mul_ps(vector,constScalar); vector = _mm256_mul_ps(vector,constScalar);
// //store //store
// _mm256_storeu_ps(&div[IX(i,j,k)],vector); _mm256_storeu_ps(&div[IX(i,j,k)],vector);
// _mm256_storeu_ps(&p[IX(i,j,k)],zeroVec); _mm256_storeu_ps(&p[IX(i,j,k)],zeroVec);
// i = 9; i = 9;
// // //
// //upper //upper
// // //
// //first part //first part
// vector = _mm256_loadu_ps(&u[IX(i+1,j,k)]); vector = _mm256_loadu_ps(&u[IX(i+1,j,k)]);
// vector = _mm256_sub_ps(vector,_mm256_loadu_ps(&u[IX(i-1,j,k)])); vector = _mm256_sub_ps(vector,_mm256_loadu_ps(&u[IX(i-1,j,k)]));
// vector = _mm256_div_ps(vector,xVector); vector = _mm256_div_ps(vector,xVector);
// //second part //second part
// vector2 = _mm256_loadu_ps(&v[IX(i,j+1,k)]); vector2 = _mm256_loadu_ps(&v[IX(i,j+1,k)]);
// vector2 = _mm256_sub_ps(vector2,_mm256_loadu_ps(&v[IX(i,j-1,k)])); vector2 = _mm256_sub_ps(vector2,_mm256_loadu_ps(&v[IX(i,j-1,k)]));
// vector2 = _mm256_div_ps(vector2,yVector); vector2 = _mm256_div_ps(vector2,yVector);
// //third part //third part
// vector3 = _mm256_loadu_ps(&w[IX(i,j,k+1)]); vector3 = _mm256_loadu_ps(&w[IX(i,j,k+1)]);
// vector3 = _mm256_sub_ps(vector3,_mm256_loadu_ps(&w[IX(i,j,k-1)])); vector3 = _mm256_sub_ps(vector3,_mm256_loadu_ps(&w[IX(i,j,k-1)]));
// vector3 = _mm256_div_ps(vector3,zVector); vector3 = _mm256_div_ps(vector3,zVector);
// //multiply and finalize //multiply and finalize
// vector = _mm256_add_ps(vector,_mm256_add_ps(vector2,vector3)); vector = _mm256_add_ps(vector,_mm256_add_ps(vector2,vector3));
// vector = _mm256_mul_ps(vector,constScalar); vector = _mm256_mul_ps(vector,constScalar);
// //store //store
// _mm256_storeu_ps(&div[IX(i,j,k)],vector); _mm256_storeu_ps(&div[IX(i,j,k)],vector);
// _mm256_storeu_ps(&p[IX(i,j,k)],zeroVec); _mm256_storeu_ps(&p[IX(i,j,k)],zeroVec);
for(i = 1; i < N - 1; i++){ // for(i = 1; i < N - 1; i++){
div[IX(i,j,k)] = // div[IX(i,j,k)] =
-scalar*h*(u[IX(i+1,j,k)]-u[IX(i-1,j,k)]+ // -scalar*h*(u[IX(i+1,j,k)]-u[IX(i-1,j,k)]+
v[IX(i,j+1,k)]-v[IX(i,j-1,k)]+ // v[IX(i,j+1,k)]-v[IX(i,j-1,k)]+
w[IX(i,j,k+1)]-w[IX(i,j,k-1)]); // w[IX(i,j,k+1)]-w[IX(i,j,k-1)]);
p[IX(i,j,k)] = 0; // p[IX(i,j,k)] = 0;
} // }
} }
} }
} }
@ -283,27 +283,27 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_solveProjection
for(j=1; j<N-1; j++){ for(j=1; j<N-1; j++){
int n = 0; int n = 0;
//solve as much as possible vectorized //solve as much as possible vectorized
// for(i = 1; i < N-1; i=i+8){ for(i = 1; i < N-1; i=i+8){
// __m256 vector = _mm256_loadu_ps(&p[IX(i-1,j,k)]); __m256 vector = _mm256_loadu_ps(&p[IX(i-1,j,k)]);
// vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i+1,j,k)])); vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i+1,j,k)]));
// vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j-1,k)])); vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j-1,k)]));
// vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j+1,k)])); vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j+1,k)]));
// vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j,k-1)])); vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j,k-1)]));
// vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j,k+1)])); vector = _mm256_add_ps(vector,_mm256_loadu_ps(&p[IX(i,j,k+1)]));
// // vector = _mm256_mul_ps(vector,aScalar); // vector = _mm256_mul_ps(vector,aScalar);
// vector = _mm256_add_ps(vector,_mm256_loadu_ps(&div[IX(i,j,k)])); vector = _mm256_add_ps(vector,_mm256_loadu_ps(&div[IX(i,j,k)]));
// vector = _mm256_div_ps(vector,cScalar); vector = _mm256_div_ps(vector,cScalar);
// _mm256_storeu_ps(&p[IX(i,j,k)],vector); _mm256_storeu_ps(&p[IX(i,j,k)],vector);
// }
// //If there is any leftover, perform manual solving
// if(i>N-1){
// for(i=i-8; i < N-1; i++){
// p[IX(i,j,k)] = (div[IX(i,j,k)] + a*(p[IX(i-1,j,k)]+p[IX(i+1,j,k)]+p[IX(i,j-1,k)]+p[IX(i,j+1,k)]+p[IX(i,j,k-1)]+p[IX(i,j,k+1)]))/c;
// }
// }
for(i=1; i < N-1; i++){
p[IX(i,j,k)] = (div[IX(i,j,k)] + a*(p[IX(i-1,j,k)]+p[IX(i+1,j,k)]+p[IX(i,j-1,k)]+p[IX(i,j+1,k)]+p[IX(i,j,k-1)]+p[IX(i,j,k+1)]))/c;
} }
//If there is any leftover, perform manual solving
if(i>N-1){
for(i=i-8; i < N-1; i++){
p[IX(i,j,k)] = (div[IX(i,j,k)] + a*(p[IX(i-1,j,k)]+p[IX(i+1,j,k)]+p[IX(i,j-1,k)]+p[IX(i,j+1,k)]+p[IX(i,j,k-1)]+p[IX(i,j,k+1)]))/c;
}
}
// for(i=1; i < N-1; i++){
// p[IX(i,j,k)] = (div[IX(i,j,k)] + a*(p[IX(i-1,j,k)]+p[IX(i+1,j,k)]+p[IX(i,j-1,k)]+p[IX(i,j+1,k)]+p[IX(i,j,k-1)]+p[IX(i,j,k+1)]))/c;
// }
} }
} }
} }
@ -347,58 +347,58 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_finalizeProjection
//v //v
// //
//lower //lower
// vector = _mm256_loadu_ps(&p[IX(1+1,j,k)]); vector = _mm256_loadu_ps(&p[IX(1+1,j,k)]);
// vector2 = _mm256_loadu_ps(&p[IX(1-1,j,k)]); vector2 = _mm256_loadu_ps(&p[IX(1-1,j,k)]);
// vector = _mm256_sub_ps(vector,vector2); vector = _mm256_sub_ps(vector,vector2);
// vector = _mm256_mul_ps(vector,xScalar); vector = _mm256_mul_ps(vector,xScalar);
// vector = _mm256_sub_ps(_mm256_loadu_ps(&u[IX(1,j,k)]),vector); vector = _mm256_sub_ps(_mm256_loadu_ps(&u[IX(1,j,k)]),vector);
// _mm256_storeu_ps(&u[IX(1,j,k)],vector); _mm256_storeu_ps(&u[IX(1,j,k)],vector);
// //upper //upper
// vector = _mm256_loadu_ps(&p[IX(9+1,j,k)]); vector = _mm256_loadu_ps(&p[IX(9+1,j,k)]);
// vector2 = _mm256_loadu_ps(&p[IX(9-1,j,k)]); vector2 = _mm256_loadu_ps(&p[IX(9-1,j,k)]);
// vector = _mm256_sub_ps(vector,vector2); vector = _mm256_sub_ps(vector,vector2);
// vector = _mm256_mul_ps(vector,xScalar); vector = _mm256_mul_ps(vector,xScalar);
// vector = _mm256_sub_ps(_mm256_loadu_ps(&u[IX(9,j,k)]),vector); vector = _mm256_sub_ps(_mm256_loadu_ps(&u[IX(9,j,k)]),vector);
// _mm256_storeu_ps(&u[IX(9,j,k)],vector); _mm256_storeu_ps(&u[IX(9,j,k)],vector);
// // //
// //v //v
// // //
// //lower //lower
// vector = _mm256_loadu_ps(&p[IX(1,j+1,k)]); vector = _mm256_loadu_ps(&p[IX(1,j+1,k)]);
// vector2 = _mm256_loadu_ps(&p[IX(1,j-1,k)]); vector2 = _mm256_loadu_ps(&p[IX(1,j-1,k)]);
// vector = _mm256_sub_ps(vector,vector2); vector = _mm256_sub_ps(vector,vector2);
// vector = _mm256_mul_ps(vector,yScalar); vector = _mm256_mul_ps(vector,yScalar);
// vector = _mm256_sub_ps(_mm256_loadu_ps(&v[IX(1,j,k)]),vector); vector = _mm256_sub_ps(_mm256_loadu_ps(&v[IX(1,j,k)]),vector);
// _mm256_storeu_ps(&v[IX(1,j,k)],vector); _mm256_storeu_ps(&v[IX(1,j,k)],vector);
// //upper //upper
// vector = _mm256_loadu_ps(&p[IX(9,j+1,k)]); vector = _mm256_loadu_ps(&p[IX(9,j+1,k)]);
// vector2 = _mm256_loadu_ps(&p[IX(9,j-1,k)]); vector2 = _mm256_loadu_ps(&p[IX(9,j-1,k)]);
// vector = _mm256_sub_ps(vector,vector2); vector = _mm256_sub_ps(vector,vector2);
// vector = _mm256_mul_ps(vector,yScalar); vector = _mm256_mul_ps(vector,yScalar);
// vector = _mm256_sub_ps(_mm256_loadu_ps(&v[IX(9,j,k)]),vector); vector = _mm256_sub_ps(_mm256_loadu_ps(&v[IX(9,j,k)]),vector);
// _mm256_storeu_ps(&v[IX(9,j,k)],vector); _mm256_storeu_ps(&v[IX(9,j,k)],vector);
// // //
// //w //w
// // //
// //lower //lower
// vector = _mm256_loadu_ps(&p[IX(1,j,k+1)]); vector = _mm256_loadu_ps(&p[IX(1,j,k+1)]);
// vector2 = _mm256_loadu_ps(&p[IX(1,j,k-1)]); vector2 = _mm256_loadu_ps(&p[IX(1,j,k-1)]);
// vector = _mm256_sub_ps(vector,vector2); vector = _mm256_sub_ps(vector,vector2);
// vector = _mm256_mul_ps(vector,zScalar); vector = _mm256_mul_ps(vector,zScalar);
// vector = _mm256_sub_ps(_mm256_loadu_ps(&w[IX(1,j,k)]),vector); vector = _mm256_sub_ps(_mm256_loadu_ps(&w[IX(1,j,k)]),vector);
// _mm256_storeu_ps(&w[IX(1,j,k)],vector); _mm256_storeu_ps(&w[IX(1,j,k)],vector);
// //upper //upper
// vector = _mm256_loadu_ps(&p[IX(9,j,k+1)]); vector = _mm256_loadu_ps(&p[IX(9,j,k+1)]);
// vector2 = _mm256_loadu_ps(&p[IX(9,j,k-1)]); vector2 = _mm256_loadu_ps(&p[IX(9,j,k-1)]);
// vector = _mm256_sub_ps(vector,vector2); vector = _mm256_sub_ps(vector,vector2);
// vector = _mm256_mul_ps(vector,zScalar); vector = _mm256_mul_ps(vector,zScalar);
// vector = _mm256_sub_ps(_mm256_loadu_ps(&w[IX(9,j,k)]),vector); vector = _mm256_sub_ps(_mm256_loadu_ps(&w[IX(9,j,k)]),vector);
// _mm256_storeu_ps(&w[IX(9,j,k)],vector); _mm256_storeu_ps(&w[IX(9,j,k)],vector);
for(i = 1; i < N-1; i++){ // for(i = 1; i < N-1; i++){
u[IX(i,j,k)] = u[IX(i,j,k)] - 0.5 * (p[IX(i+1,j,k)] - p[IX(i-1,j,k)]) / h; // u[IX(i,j,k)] = u[IX(i,j,k)] - 0.5 * (p[IX(i+1,j,k)] - p[IX(i-1,j,k)]) / h;
v[IX(i,j,k)] = v[IX(i,j,k)] - 0.5 * (p[IX(i,j+1,k)] - p[IX(i,j-1,k)]) / h; // v[IX(i,j,k)] = v[IX(i,j,k)] - 0.5 * (p[IX(i,j+1,k)] - p[IX(i,j-1,k)]) / h;
w[IX(i,j,k)] = w[IX(i,j,k)] - 0.5 * (p[IX(i,j,k+1)] - p[IX(i,j,k-1)]) / h; // w[IX(i,j,k)] = w[IX(i,j,k)] - 0.5 * (p[IX(i,j,k+1)] - p[IX(i,j,k-1)]) / h;
} // }
} }
} }
} }
@ -663,14 +663,6 @@ void advect(JNIEnv * env, uint32_t chunk_mask, int N, int b, jobjectArray jrd, j
t0*u1*d0[IX(i1,j0,k1)]+ t0*u1*d0[IX(i1,j0,k1)]+
t1*u1*d0[IX(i1,j1,k1)] t1*u1*d0[IX(i1,j1,k1)]
); );
// if(i == 1 && j == 1 && k == 1 && m == 2){
// printf("%d %d %d\n",m,n,o);
// printf("%d %d %d %d %d %d\n",i0,i1,j0,j1,k0,k1);
// printf("%.2f vs\n",d0[IX(i,j,k)]);
// printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n\n",
// d0[IX(i0,j0,k0)],d0[IX(i1,j0,k0)],d0[IX(i0,j1,k0)],d0[IX(i1,j1,k0)],
// d0[IX(i0,j0,k1)],d0[IX(i1,j0,k1)],d0[IX(i0,j1,k1)],d0[IX(i1,j1,k1)]);
// }
} }
} }
} }
@ -686,35 +678,16 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_setBoundsToNeighbors
int DIM = N; int DIM = N;
float * target = GET_ARR(env,neighborArray,CENTER_LOC); float * target = GET_ARR(env,neighborArray,CENTER_LOC);
float * source; float * source;
// if(ARR_EXISTS(chunk_mask,0,1,1)){ for(int x=1; x < DIM-1; x++){
// source = GET_ARR(env,neighborArray,CK(0,1,1)); for(int y = 1; y < DIM-1; y++){
// for(int x=1; x < DIM-1; x++){ target[IX(0,x,y)] = vector_dir==BOUND_DIR_U ? -target[IX(1,x,y)] : target[IX(1,x,y)];
// for(int y = 1; y < DIM-1; y++){
// target[IX(0,x,y)] = source[IX(DIM-2,x,y)];
// }
// }
// } else {
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++){
// if(ARR_EXISTS(chunk_mask,2,1,1)){ for(int y = 1; y < DIM-1; y++){
// source = GET_ARR(env,neighborArray,CK(2,1,1)); 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++){
// target[IX(DIM-1,x,y)] = source[IX(1,x,y)];
// }
// }
// } else {
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 x=1; x < DIM-1; x++){
for(int y = 1; y < DIM-1; y++){ for(int y = 1; y < DIM-1; y++){
//((x)+(DIM)*(y) + (DIM)*(DIM)*(z)) //((x)+(DIM)*(y) + (DIM)*(DIM)*(z))

View File

@ -175,34 +175,13 @@ public class FluidSim {
// //
//Vector stage //Vector stage
solveChunkMask(simArray); solveChunkMask(simArray);
// System.out.println("Prior to add");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
addVectorSources(simArray, timestep); addVectorSources(simArray, timestep);
// System.out.println("after add");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
swapAllVectorFields(simArray, timestep); swapAllVectorFields(simArray, timestep);
// System.out.println("after swap 11");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
solveVectorDiffusion(simArray, timestep); solveVectorDiffusion(simArray, timestep);
// System.out.println("after diffuse");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
solveProjection(simArray, step, timestep); solveProjection(simArray, step, timestep);
// System.out.println("after proj 1");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
swapAllVectorFields(simArray, timestep); swapAllVectorFields(simArray, timestep);
// System.out.println("after swap 2");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
advectVectorsAcrossBoundaries(simArray, timestep); advectVectorsAcrossBoundaries(simArray, timestep);
// System.out.println("after advect");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
solveProjection(simArray, step, timestep); solveProjection(simArray, step, timestep);
// System.out.println("after proj 2");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
// System.out.println("\n\n\n\n\n");
// if(step == 7){
// System.out.println(step);
// // System.exit(1);
// }
// //
//Density stage //Density stage
@ -213,18 +192,6 @@ public class FluidSim {
advectDensity(simArray, timestep); advectDensity(simArray, timestep);
// mirrorNeighborDensities(simArray, timestep); // mirrorNeighborDensities(simArray, timestep);
// for(int x = 0; x < simArray.length; x++){
// for(int y = 0; y < simArray[0].length; y++){
// for(int z = 0; z < simArray[0][0].length; z++){
// //
// //Reads out the results of the fluid sim
// //
// simArray[x][y][z].readDataIntoArrays();
// }
// }
// }
// System.out.println("End density stage");
// System.out.println(sumAllDensity(simArray));
@ -455,41 +422,6 @@ public class FluidSim {
} }
} }
} }
// System.out.println("after swap in proj");
// System.out.println(sumAllV(simArray) + " " + sumAllV0(simArray));
// simArray[0][0][0].copyNeighborsWrapper(2, 0, simArray[0][0][0].vAdditionVector);
// simArray[1][0][0].copyNeighborsWrapper(2, 1, simArray[1][0][0].vAdditionVector);
// simArray[0][0][0].readDataIntoArrays();
// simArray[1][0][0].readDataIntoArrays();
// System.out.println("\n\n\n");
// System.out.println("0 0 0");
// for(int i = 0; i < 18; i++){
// for(int j = 0; j < 18; j++){
// System.out.print(simArray[0][0][0].vArrayView[IX(16,i,j)] + " ");
// }
// System.out.println();
// }
// System.out.println("\n\n\n");
// System.out.println("1 0 0");
// for(int i = 0; i < 18; i++){
// for(int j = 0; j < 18; j++){
// System.out.print(simArray[1][0][0].vArrayView[IX(0,i,j)] + " ");
// }
// System.out.println();
// }
// System.out.println("\n\n\n");
// for(int i = 0; i < 18; i++){
// for(int j = 0; j < 18; j++){
// System.out.print(simArray[1][0][0].vArrayView[IX(0,i,j)] - simArray[0][0][0].vArrayView[IX(16,i,j)] + " ");
// }
// System.out.println();
// }
// float value = simArray[1][0][0].vArrayView[IX(0,1,1)] - simArray[0][0][0].vArrayView[IX(16,1,1)];
// System.out.println(simArray[0][0][0].vArrayView[IX(17,1,1)] + " " + simArray[1][0][0].vArrayView[IX(1,1,1)]);
// System.out.println("\n\n\n");
// if(step == 1){
// System.exit(1);
// }
for(int x = 0; x < simArray.length; x++){ for(int x = 0; x < simArray.length; x++){
for(int y = 0; y < simArray[0].length; y++){ for(int y = 0; y < simArray[0].length; y++){
for(int z = 0; z < simArray[0][0].length; z++){ for(int z = 0; z < simArray[0][0].length; z++){
@ -502,8 +434,6 @@ public class FluidSim {
} }
} }
} }
// System.out.println("after setup proj");
// System.out.println(sumAllV(simArray) + " " + sumAllV0(simArray));
for(int x = 0; x < simArray.length; x++){ for(int x = 0; x < simArray.length; x++){
for(int y = 0; y < simArray[0].length; y++){ for(int y = 0; y < simArray[0].length; y++){
for(int z = 0; z < simArray[0][0].length; z++){ for(int z = 0; z < simArray[0][0].length; z++){
@ -514,8 +444,6 @@ public class FluidSim {
} }
} }
} }
// System.out.println("after bound set 1 in proj");
// System.out.println(sumAllV(simArray) + " " + sumAllV0(simArray));
//samples u0, v0 //samples u0, v0
//sets u0 //sets u0
//these should have just been mirrored in the above //these should have just been mirrored in the above
@ -540,11 +468,7 @@ public class FluidSim {
} }
} }
} }
// System.out.println("after proj iteration");
// System.out.println(sumAllV(simArray) + " " + sumAllV0(simArray));
} }
// System.out.println("after proj solver");
// System.out.println(sumAllV(simArray) + " " + sumAllV0(simArray));
//samples u,v,w,u0 //samples u,v,w,u0
//sets u,v,w //sets u,v,w
//Finalize projection //Finalize projection
@ -557,8 +481,6 @@ public class FluidSim {
} }
} }
} }
// System.out.println("after finalize proj");
// System.out.println(sumAllV(simArray) + " " + sumAllV0(simArray));
//set boundaries a final time for u,v,w //set boundaries a final time for u,v,w
//... //...
for(int x = 0; x < simArray.length; x++){ for(int x = 0; x < simArray.length; x++){
@ -656,8 +578,6 @@ public class FluidSim {
} }
} }
} }
// System.out.println("after first bound swap in advect");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
//samples u,v,w,u0,v0,w0 //samples u,v,w,u0,v0,w0
for(int x = 0; x < simArray.length; x++){ for(int x = 0; x < simArray.length; x++){
for(int y = 0; y < simArray[0].length; y++){ for(int y = 0; y < simArray[0].length; y++){
@ -670,8 +590,6 @@ public class FluidSim {
} }
} }
} }
// System.out.println("before bound swap in advect");
// System.out.println(sumAllU(simArray) + " " + sumAllU0(simArray));
//mirror neighbor data //mirror neighbor data
for(int x = 0; x < simArray.length; x++){ for(int x = 0; x < simArray.length; x++){
for(int y = 0; y < simArray[0].length; y++){ for(int y = 0; y < simArray[0].length; y++){
@ -1018,16 +936,18 @@ public class FluidSim {
FloatBuffer u0FloatView = uAdditionVector[13].asFloatBuffer(); FloatBuffer u0FloatView = uAdditionVector[13].asFloatBuffer();
FloatBuffer v0FloatView = vAdditionVector[13].asFloatBuffer(); FloatBuffer v0FloatView = vAdditionVector[13].asFloatBuffer();
FloatBuffer w0FloatView = wAdditionVector[13].asFloatBuffer(); FloatBuffer w0FloatView = wAdditionVector[13].asFloatBuffer();
int index = 0;
for(int i = 0; i < DIM; i++){ for(int i = 0; i < DIM; i++){
for(int j = 0; j < DIM; j++){ for(int j = 0; j < DIM; j++){
for(int k = 0; k < DIM; k++){ for(int k = 0; k < DIM; k++){
densityArrayView[IX(i,j,k)] = xFloatView.get(); index = ((i)+(DIM)*(j) + (DIM)*(DIM)*(k));
uArrayView[IX(i,j,k)] = uFloatView.get(); densityArrayView[index] = xFloatView.get();
vArrayView[IX(i,j,k)] = vFloatView.get(); uArrayView[index] = uFloatView.get();
wArrayView[IX(i,j,k)] = wFloatView.get(); vArrayView[index] = vFloatView.get();
u0ArrayView[IX(i,j,k)] = u0FloatView.get(); wArrayView[index] = wFloatView.get();
v0ArrayView[IX(i,j,k)] = v0FloatView.get(); u0ArrayView[index] = u0FloatView.get();
w0ArrayView[IX(i,j,k)] = w0FloatView.get(); v0ArrayView[index] = v0FloatView.get();
w0ArrayView[index] = w0FloatView.get();
} }
} }
} }
@ -1053,13 +973,15 @@ public class FluidSim {
FloatBuffer u0FloatView = uAdditionVector[13].asFloatBuffer(); FloatBuffer u0FloatView = uAdditionVector[13].asFloatBuffer();
FloatBuffer v0FloatView = vAdditionVector[13].asFloatBuffer(); FloatBuffer v0FloatView = vAdditionVector[13].asFloatBuffer();
FloatBuffer w0FloatView = wAdditionVector[13].asFloatBuffer(); FloatBuffer w0FloatView = wAdditionVector[13].asFloatBuffer();
int index = 0;
for(int i = 0; i < DIM; i++){ for(int i = 0; i < DIM; i++){
for(int j = 0; j < DIM; j++){ for(int j = 0; j < DIM; j++){
for(int k = 0; k < DIM; k++){ for(int k = 0; k < DIM; k++){
x0FloatView.put(density0ArrayView[IX(i,j,k)]); index = ((i)+(DIM)*(j) + (DIM)*(DIM)*(k));
u0FloatView.put(u0ArrayView[IX(i,j,k)]); x0FloatView.put(density0ArrayView[index]);
v0FloatView.put(v0ArrayView[IX(i,j,k)]); u0FloatView.put(u0ArrayView[index]);
w0FloatView.put(w0ArrayView[IX(i,j,k)]); v0FloatView.put(v0ArrayView[index]);
w0FloatView.put(w0ArrayView[index]);
} }
} }
} }
@ -1069,12 +991,14 @@ public class FluidSim {
* Adds gravity to the simulation * Adds gravity to the simulation
*/ */
private void addGravity(){ private void addGravity(){
int index = 0;
for(int i = 0; i < DIM; i++){ for(int i = 0; i < DIM; i++){
for(int j = 0; j < DIM; j++){ for(int j = 0; j < DIM; j++){
for(int k = 0; k < DIM; k++){ for(int k = 0; k < DIM; k++){
u0ArrayView[IX(i,j,k)] = 0; index = ((i)+(DIM)*(j) + (DIM)*(DIM)*(k));
v0ArrayView[IX(i,j,k)] = densityArrayView[IX(i,j,k)] * GRAVITY; u0ArrayView[index] = 0;
w0ArrayView[IX(i,j,k)] = 0; v0ArrayView[index] = densityArrayView[index] * GRAVITY;
w0ArrayView[index] = 0;
} }
} }
} }

View File

@ -70,8 +70,8 @@ public class Main {
//redraw //redraw
GLFWContext.redraw(meshArray); GLFWContext.redraw(meshArray);
i++; i++;
if(i == 1000){ if(i == 100){
System.out.println(time / 1000.0); System.out.println(time / 100.0);
} }
if(i > 3){ if(i > 3){
// scan.next(); // scan.next();