Performance improvements
This commit is contained in:
parent
8a67458470
commit
97574dd5a0
@ -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
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -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))
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user