[Bf-blender-cvs] [9156dca] soc-2014-fluid: addForceField method in mantaflow added
Roman Pogribnyi
noreply at git.blender.org
Thu Aug 7 23:51:32 CEST 2014
Commit: 9156dcac7dbbb71739478b46c85bef5d4c27e557
Author: Roman Pogribnyi
Date: Thu Aug 7 19:58:15 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rB9156dcac7dbbb71739478b46c85bef5d4c27e557
addForceField method in mantaflow added
===================================================================
M source/blender/python/manta_pp/plugin/extforces.cpp
===================================================================
diff --git a/source/blender/python/manta_pp/plugin/extforces.cpp b/source/blender/python/manta_pp/plugin/extforces.cpp
index c98134c..4b0c9a9 100644
--- a/source/blender/python/manta_pp/plugin/extforces.cpp
+++ b/source/blender/python/manta_pp/plugin/extforces.cpp
@@ -30,6 +30,19 @@ using namespace std;
namespace Manta {
+// MLE 2014-07-05 copy from pressure.cpp
+inline void convertDescToVec(const string& desc, Vector3D<bool>& lo, Vector3D<bool>& up) {
+ for(size_t i=0; i<desc.size(); i++) {
+ if (desc[i] == 'x') lo.x = true;
+ else if (desc[i] == 'y') lo.y = true;
+ else if (desc[i] == 'z') lo.z = true;
+ else if (desc[i] == 'X') up.x = true;
+ else if (desc[i] == 'Y') up.y = true;
+ else if (desc[i] == 'Z') up.z = true;
+ else errMsg("invalid character in boundary description string. Only [xyzXYZ] allowed.");
+ }
+}
+
//! add Forces between fl/fl and fl/em cells
struct KnAddForceField : public KernelBase { KnAddForceField(FlagGrid& flags, MACGrid& vel, Grid<Vec3>& force) : KernelBase(&flags,1) ,flags(flags),vel(vel),force(force) { run(); } inline void op(int i, int j, int k, FlagGrid& flags, MACGrid& vel, Grid<Vec3>& force ) {
bool curFluid = flags.isFluid(i,j,k);
@@ -64,6 +77,10 @@ void addGravity(FlagGrid& flags, MACGrid& vel, Vec3 gravity) {
KnAddForce(flags, vel, f);
} static PyObject* _W_0 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "addGravity" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); MACGrid& vel = *_args.getPtr<MACGrid >("vel",1,&_lock); Vec3 gravity = _args.get<Vec3 >("gravity",2,&_lock); _retval = getPyNone(); addGravity(flags,vel,gravity); _args.check(); } pbF [...]
+void addForceField(FlagGrid& flags, MACGrid& vel, Grid<Vec3>& force) {
+ KnAddForceField(flags, vel, force);
+} static PyObject* _W_1 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "addForceField" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); MACGrid& vel = *_args.getPtr<MACGrid >("vel",1,&_lock); Grid<Vec3>& force = *_args.getPtr<Grid<Vec3> >("force",2,&_lock); _retval = getPyNone(); addForceField(flags,vel,force); _ar [...]
+
//! add Buoyancy force based on smoke density
struct KnAddBuoyancy : public KernelBase { KnAddBuoyancy(FlagGrid& flags, Grid<Real>& density, MACGrid& vel, Vec3 strength) : KernelBase(&flags,1) ,flags(flags),density(density),vel(vel),strength(strength) { run(); } inline void op(int i, int j, int k, FlagGrid& flags, Grid<Real>& density, MACGrid& vel, Vec3 strength ) {
if (!flags.isFluid(i,j,k)) return;
@@ -79,23 +96,40 @@ void addGravity(FlagGrid& flags, MACGrid& vel, Vec3 gravity) {
void addBuoyancy(FlagGrid& flags, Grid<Real>& density, MACGrid& vel, Vec3 gravity) {
Vec3 f = - gravity * flags.getParent()->getDt() / flags.getParent()->getDx();
KnAddBuoyancy(flags,density, vel, f);
-} static PyObject* _W_1 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "addBuoyancy" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); Grid<Real>& density = *_args.getPtr<Grid<Real> >("density",1,&_lock); MACGrid& vel = *_args.getPtr<MACGrid >("vel",2,&_lock); Vec3 gravity = _args.get<Vec3 >("gravity",3,&_lock); _ret [...]
+} static PyObject* _W_2 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "addBuoyancy" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); Grid<Real>& density = *_args.getPtr<Grid<Real> >("density",1,&_lock); MACGrid& vel = *_args.getPtr<MACGrid >("vel",2,&_lock); Vec3 gravity = _args.get<Vec3 >("gravity",3,&_lock); _ret [...]
//! 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) { run(); } inline void op(int i, int j, int k, FlagGrid& flags, MACGrid& vel ) {
+ struct KnSetWallBcs : public KernelBase { KnSetWallBcs(FlagGrid& flags, MACGrid& vel, Vector3D<bool> lo, Vector3D<bool> up, bool admm) : KernelBase(&flags,0) ,flags(flags),vel(vel),lo(lo),up(up),admm(admm) { run(); } inline void op(int i, int j, int k, FlagGrid& flags, MACGrid& vel, Vector3D<bool> lo, Vector3D<bool> up, bool admm ) {
+
bool curFluid = flags.isFluid(i,j,k);
- bool curObstacle = flags.isObstacle(i,j,k);
+ bool curObstacle = flags.isObstacle(i,j,k);
if (!curFluid && !curObstacle) return;
+
+ // MLE 2014-07-04
+ // if not admm, leave it as in orig
+ // if openBound, don't correct anything (solid is as empty)
+ // if admm, correct if vel is pointing outwards
- // we use i>0 instead of bnd=1 to check outer wall
- if (i>0 && (flags.isObstacle(i-1,j,k) || (curObstacle && flags.isFluid(i-1,j,k))))
- vel(i,j,k).x = 0;
- if (j>0 && (flags.isObstacle(i,j-1,k) || (curObstacle && flags.isFluid(i,j-1,k))))
- vel(i,j,k).y = 0;
- if (vel.is2D() || (k>0 && (flags.isObstacle(i,j,k-1) || (curObstacle && flags.isFluid(i,j,k-1)))))
- vel(i,j,k).z = 0;
-
+ // if "inner" obstacle vel
+ if(i>0 && curObstacle && !flags.isFluid(i-1,j,k)) vel(i,j,k).x = 0;
+ if(j>0 && curObstacle && !flags.isFluid(i,j-1,k)) vel(i,j,k).y = 0;
+
+ // check lo.x
+ if(!lo.x && i>0 && curFluid && flags.isObstacle(i-1,j,k) && ((admm&&vel(i,j,k).x<0)||!admm)) vel(i,j,k).x = 0;
+ // check up.x
+ if(!up.x && i>0 && curObstacle && flags.isFluid(i-1,j,k) && ((admm&&vel(i,j,k).x>0)||!admm)) vel(i,j,k).x = 0;
+ // check lo.y
+ if(!lo.y && j>0 && curFluid && flags.isObstacle(i,j-1,k) && ((admm&&vel(i,j,k).y<0)||!admm)) vel(i,j,k).y = 0;
+ // check up.y
+ if(!up.y && j>0 && curObstacle && flags.isFluid(i,j-1,k) && ((admm&&vel(i,j,k).y>0)||!admm)) vel(i,j,k).y = 0;
+ // check lo.z
+ if(!lo.z && k>0 && curFluid && flags.isObstacle(i,j,k-1) && ((admm&&vel(i,j,k).z<0)||!admm)) vel(i,j,k).z = 0;
+ // check up.z
+ if(!up.z && k>0 && curObstacle && flags.isFluid(i,j,k-1) && ((admm&&vel(i,j,k).z>0)||!admm)) vel(i,j,k).z = 0;
+
+
+ /* MLE consider later
if (curFluid) {
if ((i>0 && flags.isStick(i-1,j,k)) || (i<flags.getSizeX()-1 && flags.isStick(i+1,j,k)))
vel(i,j,k).y = vel(i,j,k).z = 0;
@@ -104,13 +138,16 @@ void addBuoyancy(FlagGrid& flags, Grid<Real>& density, MACGrid& vel, Vec3 gravit
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 run() { const int _maxX = maxX; const int _maxY = maxY; 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); } FlagGrid& flags; MACGrid& vel; };
+ */
+} inline FlagGrid& getArg0() { return flags; } typedef FlagGrid type0;inline MACGrid& getArg1() { return vel; } typedef MACGrid type1;inline Vector3D<bool> & getArg2() { return lo; } typedef Vector3D<bool> type2;inline Vector3D<bool> & getArg3() { return up; } typedef Vector3D<bool> type3;inline bool& getArg4() { return admm; } typedef bool type4; void run() { const int _maxX = maxX; const int _maxY = maxY; for (int k=minZ; k< maxZ; k++) for (int j=0; j< _maxY; j++) for (int i=0; i< [...]
+// MLE 2014-07-04
//! set no-stick boundary condition on walls
-void setWallBcs(FlagGrid& flags, MACGrid& vel) {
- KnSetWallBcs(flags, vel);
-} static PyObject* _W_2 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "setWallBcs" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); MACGrid& vel = *_args.getPtr<MACGrid >("vel",1,&_lock); _retval = getPyNone(); setWallBcs(flags,vel); _args.check(); } pbFinalizePlugin(parent,"setWallBcs" ); return _retval; } catch( [...]
-
+void setWallBcs(FlagGrid& flags, MACGrid& vel, string openBound="", bool admm=false) {
+ Vector3D<bool> lo, up;
+ convertDescToVec(openBound, lo, up);
+ KnSetWallBcs(flags, vel, lo, up, admm);
+} static PyObject* _W_3 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "setWallBcs" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); MACGrid& vel = *_args.getPtr<MACGrid >("vel",1,&_lock); string o
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list