[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