[Bf-blender-cvs] [26dca6d] soc-2014-fluid: Buoyancy in Manta using heat from Blender

Roman Pogribnyi noreply at git.blender.org
Tue Nov 11 23:43:19 CET 2014


Commit: 26dca6df7898790bf17177c812fd0b772caa3a05
Author: Roman Pogribnyi
Date:   Sun Nov 9 15:39:17 2014 +0100
Branches: soc-2014-fluid
https://developer.blender.org/rB26dca6df7898790bf17177c812fd0b772caa3a05

Buoyancy in Manta using heat from Blender

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

M	intern/smoke/intern/FLUID_3D.cpp
M	intern/smoke/intern/MANTA.cpp
M	intern/smoke/intern/scenarios/smoke.h
M	source/blender/python/manta_pp/plugin/extforces.cpp

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

diff --git a/intern/smoke/intern/FLUID_3D.cpp b/intern/smoke/intern/FLUID_3D.cpp
index f7ba1a6..c5aaae3 100644
--- a/intern/smoke/intern/FLUID_3D.cpp
+++ b/intern/smoke/intern/FLUID_3D.cpp
@@ -536,6 +536,7 @@ _xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f)
 	
 	/* heat */
 	_heat = _heatOld = _heatTemp = NULL;
+	using_heat = false;
 	if (init_heat) {
 		initHeat();
 	}
@@ -551,7 +552,6 @@ _xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f)
 	_color_b = _color_bOld = _color_bTemp = NULL;
 	using_colors = false;
 	if (init_colors) {
-		using_colors =true;
 		initColors(0.0f, 0.0f, 0.0f);
 	}
 	
@@ -578,18 +578,17 @@ _xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f)
 void FLUID_3D::initHeat()
 {
 	if (!_heat) {
-		_heat         = new float[_totalCells];
+		_heat         = NULL;
 		_heatOld      = new float[_totalCells];
 		_heatTemp      = new float[_totalCells];
 		
 		for (int x = 0; x < _totalCells; x++)
 		{
-			_heat[x]         = 0.0f;
 			_heatOld[x]      = 0.0f;
 		}
 		using_heat = true;
 		PyGILState_STATE gilstate = PyGILState_Ensure();
-//		PyRun_SimpleString("heat_low = s.create(RealGrid)");
+		PyRun_SimpleString(smoke_init_heat_low.c_str());
 		PyGILState_Release(gilstate);
 		Manta_API::updatePointers(this, using_colors);
 	}
@@ -627,9 +626,7 @@ FLUID_3D::~FLUID_3D()
 	if (_xForce) delete[] _xForce;
 	if (_yForce) delete[] _yForce;
 	if (_zForce) delete[] _zForce;
-	if (_density) delete[] _density;
 	if (_densityOld) delete[] _densityOld;
-	if (_heat) delete[] _heat;
 	if (_heatOld) delete[] _heatOld;
 	if (_obstacles) delete[] _obstacles;
 	
@@ -685,8 +682,7 @@ void FLUID_3D::step(float dt, float gravity[3])
 		// BLender computes heat buoyancy, not yet impl. in Manta
 	Manta_API::updatePointers(this,using_colors);
 	diffuseHeat();
-	addBuoyancy(_heat, _density, gravity, 0, _zRes); 
-//	SWAP_POINTERS(_heat, _heatOld);
+
 	int sim_frame = 1;
 	manta_write_effectors(this);
 	PyGILState_STATE gilstate = PyGILState_Ensure();
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 5de2b5e..e7202e7 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -367,7 +367,7 @@ void Manta_API::addAdaptiveGrid(void * data, string gridName, string solverName,
 void Manta_API::export_obstacles(float *data, int x, int y, int z)
 {
 	if (data == NULL){
-		cout << "NULL passed to grid export_obstacles " << gridName <<endl;  return;
+		cout << "NULL passed to grid export_obstacles " <<endl;  return;
 	}
 	std::ostringstream stringStream;
 	std::string grid_name = "obs_sdf";
@@ -460,8 +460,14 @@ std::string Manta_API::getRealValue( const std::string& varName, SmokeModifierDa
 		ss << 0.;
 	else if (varName == "BUYO_Z")
 		ss << (-smd->domain->beta);
+	else if (varName == "ALPHA")
+		ss << (-smd->domain->alpha);
+	else if (varName == "BETA")
+		ss << (-smd->domain->beta);
 	else if (varName == "ADVECT_ORDER")
 		ss << 2;
+	else if (varName == "GRAVITY")
+		ss << "vec3(0,0,-0.981)";
 	else if (varName == "ABS_FLOW")
 		ss << (smd->flow->flags & MOD_SMOKE_FLOW_ABSOLUTE)?"True":"False";
 	else if (varName == "DENSITY_MEM")
@@ -575,13 +581,18 @@ void * Manta_API::pointerFromString(const std::string& s){
 void Manta_API::updatePointers(FLUID_3D *fluid, bool updateColor)
 {
 	fluid->_density = (float* )pointerFromString(getGridPointer("density", "s"));
-	if (updateColor){
+	if (fluid->using_colors){
 		cout<< "POINTER FOR R_LOW" << fluid->_color_r<< endl;
 		fluid->_color_r = (float* )pointerFromString(getGridPointer("color_r_low", "s"));
 		cout<< "POINTER FOR R_LOW" << fluid->_color_r<< endl;
 		fluid->_color_g = (float* )pointerFromString(getGridPointer("color_g_low", "s"));
 		fluid->_color_b = (float* )pointerFromString(getGridPointer("color_b_low", "s"));
 	}
+	if(fluid->using_heat){
+		cout<< "Updating Heat" << fluid->_heat<< endl;
+		fluid->_heat = (float* )pointerFromString(getGridPointer("heat_low", "s"));
+		cout<< "Updating Heat" << fluid->_heat<< endl;
+	}
 }
 
 void Manta_API::updateHighResPointers(WTURBULENCE *wt, bool updateColor)
diff --git a/intern/smoke/intern/scenarios/smoke.h b/intern/smoke/intern/scenarios/smoke.h
index 2fd17ef..84d5587 100644
--- a/intern/smoke/intern/scenarios/smoke.h
+++ b/intern/smoke/intern/scenarios/smoke.h
@@ -43,7 +43,8 @@ source_grid = s.create(RealGrid)\n\
 source = s.create(Mesh)\n\
 forces = s.create(MACGrid)\n\
 dict_loaded = dict()\n\
-manta_using_colors = False\n";
+manta_using_colors = False\n\
+manta_using_heat = False\n";
 
 const string smoke_setup_high = "xl_gs = vec3($HRESX$, $HRESY$, $HRESZ$) \n\
 xl = Solver(name = 'larger', gridSize = xl_gs) \n\
@@ -113,6 +114,10 @@ color_b_high.add(xl_density) \n\
 color_b_high.multConst(manta_color_b) \n\
 manta_using_colors = True\n";
 
+const string smoke_init_heat_low = "print(\"INitializing heat lowres\")\n\
+heat_low = s.create(RealGrid)\n\
+manta_using_heat = True\n";
+
 const string smoke_del_colors_high = "\n\
 del color_r_high \n\
 del color_g_high \n\
@@ -121,6 +126,8 @@ manta_using_colors = False";
 
 const string smoke_step_low = "def sim_step_low(t):\n\
   print ('Step:' + str(t))\n\
+  if \"abc123\" in globals():\n\
+    print (abc123)\n\
   #load_once(source,'manta_flow.obj',dict_loaded)\n\
   #if t == 2:#loading data on first sim frame only\n\
   #  print('First frame: loading flows and obstacles')\n\
@@ -130,7 +137,6 @@ const string smoke_step_low = "def sim_step_low(t):\n\
   #load emission data\n\
   #source_grid.load('manta_em_influence.uni')\n\
   #density.add(source_grid)\n\
-  addForceField(flags=flags, vel=vel,force=forces)\n\
   \n\
   if manta_using_colors:\n\
     advectSemiLagrange(flags=flags, vel=vel, grid=color_r_low, order=$ADVECT_ORDER$)\n\
@@ -140,7 +146,12 @@ const string smoke_step_low = "def sim_step_low(t):\n\
   advectSemiLagrange(flags=flags, vel=vel, grid=vel    , order=$ADVECT_ORDER$, strength=1.0)\n\
   \n\
   setWallBcs(flags=flags, vel=vel)    \n\
-  addBuoyancy(density=density, vel=vel, gravity=vec3($BUYO_X$,$BUYO_Y$,$BUYO_Z$), flags=flags)\n\
+      #buoyancy calculated in Blender, from _heat fields\n\
+  #addBuoyancy(density=density, vel=vel, gravity=vec3($BUYO_X$,$BUYO_Y$,$BUYO_Z$), flags=flags)\n\
+  if manta_using_heat:\n\
+    addHeatBuoyancy(density=density, densCoeff = $ALPHA$, vel=vel, gravity=$GRAVITY$, flags=flags, heat = heat_low, heatCoeff = $BETA$*10)\n\
+  #vorticityConfinement( vel=vel, flags=flags, strength=0.2 ) \n\
+  addForceField(flags=flags, vel=vel,force=forces)\n\
   \n\
   solvePressure(flags=flags, vel=vel, pressure=pressure, useResNorm=True, openBound='xXyYzZ')\n\
   setWallBcs(flags=flags, vel=vel)\n\
diff --git a/source/blender/python/manta_pp/plugin/extforces.cpp b/source/blender/python/manta_pp/plugin/extforces.cpp
index c8a4c6f..b0de81e 100644
--- a/source/blender/python/manta_pp/plugin/extforces.cpp
+++ b/source/blender/python/manta_pp/plugin/extforces.cpp
@@ -99,6 +99,18 @@ void addBuoyancy(FlagGrid& flags, Grid<Real>& density, MACGrid& vel, Vec3 gravit
 	KnAddBuoyancy(flags,density, vel, f);
 } 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 [...]
 
+//! add Buoyancy force based on density and heat field
+ struct KnAddHeatBuoyancy : public KernelBase { KnAddHeatBuoyancy(FlagGrid& flags, Grid<Real>& density,float densCoeff, MACGrid& vel, Vec3 strength, Grid<Real>& heat, float heatCoeff) :  KernelBase(&flags,1) ,flags(flags),density(density),densCoeff(densCoeff),vel(vel),strength(strength),heat(heat),heatCoeff(heatCoeff)   { run(); }  inline void op(int i, int j, int k, FlagGrid& flags, Grid<Real>& density,float densCoeff, MACGrid& vel, Vec3 strength, Grid<Real>& heat, float heatCoeff )  {    
+	if (!flags.isFluid(i,j,k)) return;
+	vel(i,j,k).x += (strength.x) * (densCoeff * density(i,j,k) - heatCoeff * heat(i,j,k));
+	vel(i,j,k).y += (strength.y) * (densCoeff * density(i,j,k) - heatCoeff * heat(i,j,k));
+	vel(i,j,k).z += (strength.z) * (densCoeff * density(i,j,k) - heatCoeff * heat(i,j,k));    
+}   inline FlagGrid& getArg0() { return flags; } typedef FlagGrid type0;inline Grid<Real>& getArg1() { return density; } typedef Grid<Real> type1;inline float& getArg2() { return densCoeff; } typedef float type2;inline MACGrid& getArg3() { return vel; } typedef MACGrid type3;inline Vec3& getArg4() { return strength; } typedef Vec3 type4;inline Grid<Real>& getArg5() { return heat; } typedef Grid<Real> type5;inline float& getArg6() { return heatCoeff; } typedef float type6; void run() {  c [...]
+//! add Buoyancy force based on density and heat field
+void addHeatBuoyancy(FlagGrid& flags, Grid<Real>& density,float densCoeff, MACGrid& vel, Vec3 gravity, Grid<Real>& heat, float heatCoeff) {
+	Vec3 f = - gravity;
+	KnAddHeatBuoyancy(flags,density,densCoeff, vel, f, heat, heatCoeff);
+} static PyObject* _W_3 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "addHeatBuoyancy" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); Grid<Real>& density = *_args.getPtr<Grid<Real> >("density",1,&_lock); float densCoeff = _args.get<float >("densCoeff",2,&_lock);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list