Commit: b203980733eeb9c3a65ee33bd6f224a3d0893a4d
Author: Sebastián Barschkis
Date:   Mon Jun 19 19:27:44 2017 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rBb203980733eeb9c3a65ee33bd6f224a3d0893a4d

refactored obstacle velocities

===================================================================

M       intern/mantaflow/intern/manta_pp/omp/plugin/extforces.cpp
M       intern/mantaflow/intern/manta_pp/omp/registration.cpp
M       intern/mantaflow/intern/manta_pp/tbb/plugin/extforces.cpp
M       intern/mantaflow/intern/manta_pp/tbb/registration.cpp
M       intern/mantaflow/intern/strings/liquid_script.h
M       intern/mantaflow/intern/strings/shared_script.h
M       intern/mantaflow/intern/strings/smoke_script.h

===================================================================

diff --git a/intern/mantaflow/intern/manta_pp/omp/plugin/extforces.cpp 
b/intern/mantaflow/intern/manta_pp/omp/plugin/extforces.cpp
index 2cc1a02da7d..ad96422d1cc 100644
--- a/intern/mantaflow/intern/manta_pp/omp/plugin/extforces.cpp
+++ b/intern/mantaflow/intern/manta_pp/omp/plugin/extforces.cpp
@@ -224,21 +224,33 @@ void setInflowBcs(MACGrid& vel, string dir, Vec3 value) {
 // set obstacle boundary conditions
 
 //! set no-stick wall boundary condition between ob/fl and ob/ob cells
- struct KnSetWallBcs : public KernelBase { KnSetWallBcs(FlagGrid& flags, 
MACGrid& vel) :  KernelBase(&flags,0) ,flags(flags),vel(vel)   { runMessage(); 
run(); }  inline void op(int i, int j, int k, FlagGrid& flags, MACGrid& vel )  {
+ struct KnSetWallBcs : public KernelBase { KnSetWallBcs(FlagGrid& flags, 
MACGrid& vel, Grid<Vec3>* obvel) :  KernelBase(&flags,0) 
,flags(flags),vel(vel),obvel(obvel)   { runMessage(); run(); }  inline void 
op(int i, int j, int k, FlagGrid& flags, MACGrid& vel, Grid<Vec3>* obvel )  {
 
        bool curFluid = flags.isFluid(i,j,k);
        bool curObs   = flags.isObstacle(i,j,k);
-       if (!curFluid && !curObs) return; 
+       Vec3 bcsVel(0.,0.,0.);
+       if (!curFluid && !curObs) return;
+
+       // optional obstacle velocities. interpolate centered obvels or just 
copy obvels (for MAC grids)
+       if (obvel) {
+               bool isMACObvel = obvel->getType() & GridBase::TypeMAC;
+               if (i>0 && (*obvel)(i,j,k).x)
+                       bcsVel.x = (isMACObvel || !(*obvel)(i-1,j,k).x) ? 
(*obvel)(i,j,k).x : 0.5*((*obvel)(i-1,j,k).x + (*obvel)(i,j,k).x);
+               if (j>0 && (*obvel)(i,j,k).y)
+                       bcsVel.y = (isMACObvel || !(*obvel)(i,j-1,k).y) ? 
(*obvel)(i,j,k).y : 0.5*((*obvel)(i,j-1,k).y + (*obvel)(i,j,k).y);
+               if (k>0 && (*obvel)(i,j,k).z)
+                       bcsVel.z = (isMACObvel || !(*obvel)(i,j,k-1).z) ? 
(*obvel)(i,j,k).z : 0.5*((*obvel)(i,j,k-1).z + (*obvel)(i,j,k).z);
+       }
 
        // we use i>0 instead of bnd=1 to check outer wall
-       if (i>0 && flags.isObstacle(i-1,j,k))                                   
         vel(i,j,k).x = 0;
-       if (i>0 && curObs && flags.isFluid(i-1,j,k))                            
 vel(i,j,k).x = 0;
-       if (j>0 && flags.isObstacle(i,j-1,k))                                   
         vel(i,j,k).y = 0;
-       if (j>0 && curObs && flags.isFluid(i,j-1,k))                            
 vel(i,j,k).y = 0;
-
-       if(!vel.is3D()) {                                                       
vel(i,j,k).z = 0; } else {
-       if (k>0 && flags.isObstacle(i,j,k-1))                                   
        vel(i,j,k).z = 0;
-       if (k>0 && curObs && flags.isFluid(i,j,k-1))                            
vel(i,j,k).z = 0; }
+       if (i>0 && flags.isObstacle(i-1,j,k))                                   
         vel(i,j,k).x = bcsVel.x;
+       if (i>0 && curObs && flags.isFluid(i-1,j,k))                            
 vel(i,j,k).x = bcsVel.x;
+       if (j>0 && flags.isObstacle(i,j-1,k))                                   
         vel(i,j,k).y = bcsVel.y;
+       if (j>0 && curObs && flags.isFluid(i,j-1,k))                            
 vel(i,j,k).y = bcsVel.y;
+
+       if(!vel.is3D()) {                                                       
vel(i,j,k).z = bcsVel.z; } else {
+       if (k>0 && flags.isObstacle(i,j,k-1))                                   
        vel(i,j,k).z = bcsVel.z;
+       if (k>0 && curObs && flags.isFluid(i,j,k-1))                            
vel(i,j,k).z = bcsVel.z; }
        
        if (curFluid) {
                if ((i>0 && flags.isStick(i-1,j,k)) || (i<flags.getSizeX()-1 && 
flags.isStick(i+1,j,k)))
@@ -248,15 +260,15 @@ void setInflowBcs(MACGrid& vel, string dir, Vec3 value) {
                if (vel.is3D() && ((k>0 && flags.isStick(i,j,k-1)) || 
(k<flags.getSizeZ()-1 && flags.isStick(i,j,k+1))))
                        vel(i,j,k).x = vel(i,j,k).y = 0;
        }
-}   inline FlagGrid& getArg0() { return flags; } typedef FlagGrid type0;inline 
MACGrid& getArg1() { return vel; } typedef MACGrid type1; void runMessage() { 
debMsg("Executing kernel KnSetWallBcs ", 3); debMsg("Kernel range" <<  " x "<<  
maxX  << " y "<< maxY  << " z "<< minZ<<" - "<< maxZ  << " "   , 4); }; void 
run() {  const int _maxX = maxX; const int _maxY = maxY; if (maxZ > 1) { 
+}   inline FlagGrid& getArg0() { return flags; } typedef FlagGrid type0;inline 
MACGrid& getArg1() { return vel; } typedef MACGrid type1;inline Grid<Vec3>* 
getArg2() { return obvel; } typedef Grid<Vec3> type2; void runMessage() { 
debMsg("Executing kernel KnSetWallBcs ", 3); debMsg("Kernel range" <<  " x "<<  
maxX  << " y "<< maxY  << " z "<< minZ<<" - "<< maxZ  << " "   , 4); }; void 
run() {  const int _maxX = maxX; const int _maxY = maxY; if (maxZ > 1) { 
 #pragma omp parallel 
  {  
 #pragma omp for  
-  for (int k=minZ; k < maxZ; k++) for (int j=0; j < _maxY; j++) for (int i=0; 
i < _maxX; i++) op(i,j,k,flags,vel);  } } else { const int k=0; 
+  for (int k=minZ; k < maxZ; k++) for (int j=0; j < _maxY; j++) for (int i=0; 
i < _maxX; i++) op(i,j,k,flags,vel,obvel);  } } else { const int k=0; 
 #pragma omp parallel 
  {  
 #pragma omp for  
-  for (int j=0; j < _maxY; j++) for (int i=0; i < _maxX; i++) 
op(i,j,k,flags,vel);  } }  } FlagGrid& flags; MACGrid& vel;   };
+  for (int j=0; j < _maxY; j++) for (int i=0; i < _maxX; i++) 
op(i,j,k,flags,vel,obvel);  } }  } FlagGrid& flags; MACGrid& vel; Grid<Vec3>* 
obvel;   };
 #line 171 "plugin/extforces.cpp"
 
 
@@ -360,111 +372,15 @@ void setInflowBcs(MACGrid& vel, string dir, Vec3 value) {
 
 //! set zero normal velocity boundary condition on walls
 // (optionally with second order accuracy using the obstacle SDF , fractions 
grid currentlyl not needed)
-void setWallBcs(FlagGrid& flags, MACGrid& vel, MACGrid* fractions = 0, 
Grid<Real>* phiObs = 0, int boundaryWidth=0) {
+void setWallBcs(FlagGrid& flags, MACGrid& vel, Grid<Vec3>* obvel = 0, MACGrid* 
fractions = 0, Grid<Real>* phiObs = 0, int boundaryWidth=0) {
        if(!phiObs) {
-               KnSetWallBcs(flags, vel);
+               KnSetWallBcs(flags, vel, obvel);
        } else {
                MACGrid tmpvel(vel.getParent());
                KnSetWallBcsFrac(flags, vel, tmpvel, phiObs, boundaryWidth);
                vel.swap(tmpvel);
        }
-} static PyObject* _W_5 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) 
{ try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = 
_args.obtainParent(); bool noTiming = _args.getOpt<bool>("notiming", -1, 0); 
pbPreparePlugin(parent, "setWallBcs" , !noTiming ); PyObject *_retval = 0; { 
ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); 
MACGrid& vel = *_args.getPtr<MACGrid >("vel",1,&_lock); MACGrid* fractions = 
_args.getPtrOpt<MACGrid >("fractions",2,0, [...]
-
-//! add obstacle velocity between obs/obs, obs/fl and/or obs,em cells. expects 
centered obvels, sets staggered vels
-
- struct KnSetObstacleVelocity : public KernelBase { 
KnSetObstacleVelocity(FlagGrid& flags, MACGrid& vel, Grid<Vec3>& obvel, int 
boundaryWidth, int borderWidth) :  KernelBase(&flags,boundaryWidth) 
,flags(flags),vel(vel),obvel(obvel),boundaryWidth(boundaryWidth),borderWidth(borderWidth)
   { runMessage(); run(); }  inline void op(int i, int j, int k, FlagGrid& 
flags, MACGrid& vel, Grid<Vec3>& obvel, int boundaryWidth, int borderWidth )  {
-       bool curFluid = flags.isFluid(i,j,k);
-       bool curObs   = flags.isObstacle(i,j,k);
-       if (!curFluid && !curObs) return;
-
-       // Set vel for obstacle cells: getting centered vels and setting 
staggered
-       // Affects all cells inside obstacle. obvels end exactly at obs/fl or 
obs/em border
-       if (flags.isObstacle(i-1,j,k) || (curObs && flags.isFluid(i-1,j,k)) || 
(curObs && flags.isEmpty(i-1,j,k))) {
-
-               // Sanity check: if neighbour cell has no velocity, then do not 
interpolate. Just use centered obvel of current cell
-               // Should not happen if obvels are present in all obstacle cell 
inside and some around obstacle
-               if (obvel(i-1,j,k).x == 0.)
-                       vel(i,j,k).x = obvel(i,j,k).x;
-               else
-                       vel(i,j,k).x = 0.5*(obvel(i-1,j,k).x + obvel(i,j,k).x);
-       }
-       if (flags.isObstacle(i,j-1,k) || (curObs && flags.isFluid(i,j-1,k)) || 
(curObs && flags.isEmpty(i,j-1,k))) {
-               if (obvel(i,j-1,k).y == 0.)
-                       vel(i,j,k).y = obvel(i,j,k).y;
-               else
-                       vel(i,j,k).y = 0.5*(obvel(i,j-1,k).y + obvel(i,j,k).y);
-               
-       }
-       if (vel.is3D() && (flags.isObstacle(i,j,k-1) || (curObs && 
flags.isFluid(i,j,k-1)) || (curObs && flags.isEmpty(i,j,k-1)))) {
-               if (obvel(i,j,k-1).z == 0.)
-                       vel(i,j,k).z = obvel(i,j,k).z;
-               else
-                       vel(i,j,k).z = 0.5*(obvel(i,j,k-1).z + obvel(i,j,k).z);
-       }
-
-       // Optional border velocities outside of obstacle
-       if (borderWidth <= 0) return;
-       for (int d=1; d<1+borderWidth; ++d)
-       {
-               // Sanity check: do not check cells that dont exist
-               if (i-d<0 || i+d>=vel.getSizeX() || j-d<0 || 
j+d>=vel.getSizeY()) return;
-               if (vel.is3D() && (k-d<0 || k+d>=vel.getSizeZ())) return;
-
-               // Is the neighbour cell an obstacle and has obvel (i.e. is it 
a moving obstacle cell)?
-               bool rObs = flags.isObstacle(i+d,j,k); // right
-               bool lObs = flags.isObstacle(i-d,j,k); // left
-               bool uObs = flags.isObstacle(i,j+d,k); // up
-               bool dObs = flags.isObstacle(i,j-d,k); // down
-               bool tObs = flags.isObstacle(i,j,k+d); // top
-               bool bObs = flags.isObstacle(i,j,k-d); // bottom
-
-               bool rupObs = flags.isObstacle(i+d,j+d,k+d); // corner right up 
top
-               bool rdtObs = flags.isObstacle(i+d,j-d,k+d); // corner right 
down top
-               bool lupObs = flags.isObstacle(i-d,j+d,k+d); // corner left up 
top
-               bool ldtObs = flags.isObstacle(i-d,j-d,k+d); // corner left 
down top
-
-               bool rubObs = flags.isObstacle(i+d,j+d,k-d); // corner right up 
bottom
-               bool rdbObs = flags.isObstacle(i+d,j-d,k-d); // corner right 
down bottom
-               bool lubObs = flags.isObstacle(i-d,j+d,k-d); // corner left up 
bottom
-               bool ldbObs = flags.isObstacle(i-d,j-d,k-d); // corner left 
down bottom
-
-               if (rObs || lObs || uObs || dObs || tObs || bObs
-                       || rupObs || rdtObs || lupObs || ldtObs || rubObs || 
rdbObs || lubObs || ldbObs) {
-
-                       // Sanity check: if neighbour cell has no obvel, then 
do not interpolate. Just use centered obvel of current cell
-                       // Should not happen if obvels were extrapolated 
outside of obstacle beforehand
-                       if (obvel(i-1,j,k).x == 0.)
-                               vel(i,j,k).x = obvel(i,j,k).x;
-                       else
-                               vel(i,j,k).x = 0.5*(obvel(i-1,j,k).x + 
obvel(i,j,k).x);
-
-                       if (obvel(i,j-1,k).y == 0.)
-                               vel(i,j,k).y = obvel(i,j,k).y;


@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to