From f93936a96eab2ac13c66a556ba10725212a6f4b1 Mon Sep 17 00:00:00 2001 From: unknown <> Date: Sun, 10 Mar 2024 18:09:42 -0400 Subject: [PATCH] neighbor operations use raw arrays --- src/main/c/fluidsim.c | 616 ++++++++++++++-------------- src/main/c/includes/mainFunctions.h | 16 - src/main/c/velocitystep.c | 281 ------------- 3 files changed, 308 insertions(+), 605 deletions(-) diff --git a/src/main/c/fluidsim.c b/src/main/c/fluidsim.c index df0757d..6bf90fb 100644 --- a/src/main/c/fluidsim.c +++ b/src/main/c/fluidsim.c @@ -261,12 +261,12 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( 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); + 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); } } //solve vector diffusion @@ -300,129 +300,18 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( 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); + 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; - 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++){ Chunk * currentChunk = chunks[i]; 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,1,currentChunk->u0); setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,2,currentChunk->v0); - setBoundsToNeighborsRaw(env,chunkJRaw,DIM,chunkMask,3,currentChunk->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); - } - } - //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); + 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++){ @@ -714,18 +435,297 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_simulate( 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); + 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); + } + } + //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); } } diff --git a/src/main/c/includes/mainFunctions.h b/src/main/c/includes/mainFunctions.h index 2c145e6..33cb364 100644 --- a/src/main/c/includes/mainFunctions.h +++ b/src/main/c/includes/mainFunctions.h @@ -83,14 +83,6 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_solveDiffuseDensity JNIEXPORT void JNICALL Java_electrosphere_FluidSim_advectDensity (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 (JNIEnv * env, jobject this, @@ -99,14 +91,6 @@ JNIEXPORT void JNICALL setBoundsToNeighborsRaw jint vector_dir, 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 (JNIEnv * env, jobject this, diff --git a/src/main/c/velocitystep.c b/src/main/c/velocitystep.c index 954e4c0..6106a5c 100644 --- a/src/main/c/velocitystep.c +++ b/src/main/c/velocitystep.c @@ -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); } -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 @@ -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)]; - } - - - -} \ No newline at end of file