Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiika Hamalainen <blender@miikah.org>2012-05-27 01:36:19 +0400
committerMiika Hamalainen <blender@miikah.org>2012-05-27 01:36:19 +0400
commiteda0f3b1863e2e41b9913e16af82407b63e145bf (patch)
treedb4a2b0c0a9a7f769cbed3e4b915c0d8ea3e72bb /intern/smoke
parentebdeed07e573459f6ae065fd8b306070814cb290 (diff)
Fix for smoke boundary conditions: "Open borders" behaved differently for positive and negative axises.
+ Some code cleanup.
Diffstat (limited to 'intern/smoke')
-rw-r--r--intern/smoke/intern/FLUID_3D.cpp73
-rw-r--r--intern/smoke/intern/FLUID_3D_STATIC.cpp99
2 files changed, 56 insertions, 116 deletions
diff --git a/intern/smoke/intern/FLUID_3D.cpp b/intern/smoke/intern/FLUID_3D.cpp
index 821b428363e..f638a936049 100644
--- a/intern/smoke/intern/FLUID_3D.cpp
+++ b/intern/smoke/intern/FLUID_3D.cpp
@@ -153,11 +153,11 @@ void FLUID_3D::setBorderObstacles()
{
// bottom slab
index = x + y * _xRes;
- if(_domainBcBottom==1) _obstacles[index] = 1;
+ if(_domainBcBottom) _obstacles[index] = 1;
// top slab
index += _totalCells - _slabSize;
- if(_domainBcTop==1) _obstacles[index] = 1;
+ if(_domainBcTop) _obstacles[index] = 1;
}
for (int z = 0; z < _zRes; z++)
@@ -165,11 +165,11 @@ void FLUID_3D::setBorderObstacles()
{
// front slab
index = x + z * _slabSize;
- if(_domainBcFront==1) _obstacles[index] = 1;
+ if(_domainBcFront) _obstacles[index] = 1;
// back slab
index += _slabSize - _xRes;
- if(_domainBcBack==1) _obstacles[index] = 1;
+ if(_domainBcBack) _obstacles[index] = 1;
}
for (int z = 0; z < _zRes; z++)
@@ -177,11 +177,11 @@ void FLUID_3D::setBorderObstacles()
{
// left slab
index = y * _xRes + z * _slabSize;
- if(_domainBcLeft==1) _obstacles[index] = 1;
+ if(_domainBcLeft) _obstacles[index] = 1;
// right slab
index += _xRes - 1;
- if(_domainBcRight==1) _obstacles[index] = 1;
+ if(_domainBcRight) _obstacles[index] = 1;
}
}
@@ -449,48 +449,7 @@ void FLUID_3D::setBorderCollisions() {
// set side obstacles
- int index;
- for (int y = 0; y < _yRes; y++)
- for (int x = 0; x < _xRes; x++)
- {
- // front slab
- index = x + y * _xRes;
- if(_domainBcBottom==1) _obstacles[index] = 1;
- else _obstacles[index] = 0;
-
- // back slab
- index += _totalCells - _slabSize;
- if(_domainBcTop==1) _obstacles[index] = 1;
- else _obstacles[index] = 0;
- }
-
- for (int z = 0; z < _zRes; z++)
- for (int x = 0; x < _xRes; x++)
- {
- // bottom slab
- index = x + z * _slabSize;
- if(_domainBcFront==1) _obstacles[index] = 1;
- else _obstacles[index] = 0;
-
- // top slab
- index += _slabSize - _xRes;
- if(_domainBcBack==1) _obstacles[index] = 1;
- else _obstacles[index] = 0;
- }
-
- for (int z = 0; z < _zRes; z++)
- for (int y = 0; y < _yRes; y++)
- {
- // left slab
- index = y * _xRes + z * _slabSize;
- if(_domainBcLeft==1) _obstacles[index] = 1;
- else _obstacles[index] = 0;
-
- // right slab
- index += _xRes - 1;
- if(_domainBcRight==1) _obstacles[index] = 1;
- else _obstacles[index] = 0;
- }
+ setBorderObstacles();
}
//////////////////////////////////////////////////////////////////////
@@ -813,13 +772,13 @@ void FLUID_3D::project()
setObstacleBoundaries(_pressure, 0, _zRes);
// copy out the boundaries
- if(_domainBcLeft == 0) setNeumannX(_xVelocity, _res, 0, _zRes);
+ if(!_domainBcLeft) setNeumannX(_xVelocity, _res, 0, _zRes);
else setZeroX(_xVelocity, _res, 0, _zRes);
- if(_domainBcFront == 0) setNeumannY(_yVelocity, _res, 0, _zRes);
+ if(!_domainBcFront) setNeumannY(_yVelocity, _res, 0, _zRes);
else setZeroY(_yVelocity, _res, 0, _zRes);
- if(_domainBcTop == 0) setNeumannZ(_zVelocity, _res, 0, _zRes);
+ if(!_domainBcTop) setNeumannZ(_zVelocity, _res, 0, _zRes);
else setZeroZ(_zVelocity, _res, 0, _zRes);
/*
@@ -1369,13 +1328,13 @@ void FLUID_3D::advectMacCormackBegin(int zBegin, int zEnd)
{
Vec3Int res = Vec3Int(_xRes,_yRes,_zRes);
- if(_domainBcLeft == 0) copyBorderX(_xVelocityOld, res, zBegin, zEnd);
+ if(!_domainBcLeft) copyBorderX(_xVelocityOld, res, zBegin, zEnd);
else setZeroX(_xVelocityOld, res, zBegin, zEnd);
- if(_domainBcFront == 0) copyBorderY(_yVelocityOld, res, zBegin, zEnd);
+ if(!_domainBcFront) copyBorderY(_yVelocityOld, res, zBegin, zEnd);
else setZeroY(_yVelocityOld, res, zBegin, zEnd);
- if(_domainBcTop == 0) copyBorderZ(_zVelocityOld, res, zBegin, zEnd);
+ if(!_domainBcTop) copyBorderZ(_zVelocityOld, res, zBegin, zEnd);
else setZeroZ(_zVelocityOld, res, zBegin, zEnd);
}
@@ -1423,13 +1382,13 @@ void FLUID_3D::advectMacCormackEnd2(int zBegin, int zEnd)
advectFieldMacCormack2(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _yVelocityOld, _yVelocityTemp, _yVelocity, t1, res, _obstacles, zBegin, zEnd);
advectFieldMacCormack2(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _zVelocityOld, _zVelocityTemp, _zVelocity, t1, res, _obstacles, zBegin, zEnd);
- if(_domainBcLeft == 0) copyBorderX(_xVelocityTemp, res, zBegin, zEnd);
+ if(!_domainBcLeft) copyBorderX(_xVelocityTemp, res, zBegin, zEnd);
else setZeroX(_xVelocityTemp, res, zBegin, zEnd);
- if(_domainBcFront == 0) copyBorderY(_yVelocityTemp, res, zBegin, zEnd);
+ if(!_domainBcFront) copyBorderY(_yVelocityTemp, res, zBegin, zEnd);
else setZeroY(_yVelocityTemp, res, zBegin, zEnd);
- if(_domainBcTop == 0) copyBorderZ(_zVelocityTemp, res, zBegin, zEnd);
+ if(!_domainBcTop) copyBorderZ(_zVelocityTemp, res, zBegin, zEnd);
else setZeroZ(_zVelocityTemp, res, zBegin, zEnd);
setZeroBorder(_density, res, zBegin, zEnd);
diff --git a/intern/smoke/intern/FLUID_3D_STATIC.cpp b/intern/smoke/intern/FLUID_3D_STATIC.cpp
index 85b3657dc92..74c2c9c7e2d 100644
--- a/intern/smoke/intern/FLUID_3D_STATIC.cpp
+++ b/intern/smoke/intern/FLUID_3D_STATIC.cpp
@@ -92,19 +92,15 @@ void FLUID_3D::setNeumannX(float* field, Vec3Int res, int zBegin, int zEnd)
// left slab
index = y * res[0] + z * slabSize;
field[index] = field[index + 2];
+ /* only allow outwards flux */
+ if(field[index]>0.) field[index] = 0.;
+ index += 1;
+ if(field[index]>0.) field[index] = 0.;
// right slab
- index += res[0] - 1;
+ index = y * res[0] + z * slabSize + res[0] - 1;
field[index] = field[index - 2];
- }
-
- // fix, force top slab to only allow outwards flux
- for (int y = 0; y < res[1]; y++)
- for (int z = zBegin; z < zEnd; z++)
- {
- // top slab
- index = y * res[0] + z * slabSize;
- index += res[0] - 1;
+ /* only allow outwards flux */
if(field[index]<0.) field[index] = 0.;
index -= 1;
if(field[index]<0.) field[index] = 0.;
@@ -121,27 +117,22 @@ void FLUID_3D::setNeumannY(float* field, Vec3Int res, int zBegin, int zEnd)
for (int z = zBegin; z < zEnd; z++)
for (int x = 0; x < res[0]; x++)
{
- // bottom slab
+ // front slab
index = x + z * slabSize;
field[index] = field[index + 2 * res[0]];
+ /* only allow outwards flux */
+ if(field[index]>0.) field[index] = 0.;
+ index += res[0];
+ if(field[index]>0.) field[index] = 0.;
- // top slab
- index += slabSize - res[0];
+ // back slab
+ index = x + z * slabSize + slabSize - res[0];
field[index] = field[index - 2 * res[0]];
- }
-
- // fix, force top slab to only allow outwards flux
- for (int z = zBegin; z < zEnd; z++)
- for (int x = 0; x < res[0]; x++)
- {
- // top slab
- index = x + z * slabSize;
- index += slabSize - res[0];
+ /* only allow outwards flux */
if(field[index]<0.) field[index] = 0.;
index -= res[0];
if(field[index]<0.) field[index] = 0.;
}
-
}
//////////////////////////////////////////////////////////////////////
@@ -154,43 +145,33 @@ void FLUID_3D::setNeumannZ(float* field, Vec3Int res, int zBegin, int zEnd)
const int cellsslab = totalCells - slabSize;
int index;
- index = 0;
- if (zBegin == 0)
- for (int y = 0; y < res[1]; y++)
- for (int x = 0; x < res[0]; x++, index++)
- {
- // front slab
- field[index] = field[index + 2 * slabSize];
- }
-
- if (zEnd == res[2])
- {
- index = 0;
- int indexx = 0;
-
- for (int y = 0; y < res[1]; y++)
- for (int x = 0; x < res[0]; x++, index++)
- {
-
- // back slab
- indexx = index + cellsslab;
- field[indexx] = field[indexx - 2 * slabSize];
- }
-
-
- // fix, force top slab to only allow outwards flux
- for (int y = 0; y < res[1]; y++)
- for (int x = 0; x < res[0]; x++)
- {
- // top slab
- index = x + y * res[0];
- index += cellsslab;
- if(field[index]<0.) field[index] = 0.;
- index -= slabSize;
- if(field[index]<0.) field[index] = 0.;
- }
+ if (zBegin == 0) {
+ for (int y = 0; y < res[1]; y++)
+ for (int x = 0; x < res[0]; x++)
+ {
+ // front slab
+ index = x + y * res[0];
+ field[index] = field[index + 2 * slabSize];
+ /* only allow outwards flux */
+ if(field[index]>0.) field[index] = 0.;
+ index += slabSize;
+ if(field[index]>0.) field[index] = 0.;
+ }
+ }
- } // zEnd == res[2]
+ if (zEnd == res[2]) {
+ for (int y = 0; y < res[1]; y++)
+ for (int x = 0; x < res[0]; x++)
+ {
+ // back slab
+ index = x + y * res[0] + cellsslab;
+ field[index] = field[index - 2 * slabSize];
+ /* only allow outwards flux */
+ if(field[index]<0.) field[index] = 0.;
+ index -= slabSize;
+ if(field[index]<0.) field[index] = 0.;
+ }
+ }
}