[Bf-blender-cvs] [8e5f736] fluid-mantaflow: implemented external forces

Sebastián Barschkis noreply at git.blender.org
Fri Mar 25 18:33:01 CET 2016


Commit: 8e5f736da7e3712c383ff805c3fe90e0ab421e04
Author: Sebastián Barschkis
Date:   Fri Mar 25 18:32:39 2016 +0100
Branches: fluid-mantaflow
https://developer.blender.org/rB8e5f736da7e3712c383ff805c3fe90e0ab421e04

implemented external forces

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

M	intern/mantaflow/intern/MANTA.cpp
M	intern/mantaflow/intern/manta_pp/plugin/extforces.cpp
M	intern/mantaflow/intern/strings/smoke.h
M	source/blender/blenkernel/intern/smoke.c

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

diff --git a/intern/mantaflow/intern/MANTA.cpp b/intern/mantaflow/intern/MANTA.cpp
index 91a35b0..471420b 100644
--- a/intern/mantaflow/intern/MANTA.cpp
+++ b/intern/mantaflow/intern/MANTA.cpp
@@ -648,6 +648,9 @@ void MANTA::updatePointers(SmokeModifierData *smd)
 	mVelocityX      = (float*) pointerFromString( getGridPointer("x_vel",      "s") );
 	mVelocityY      = (float*) pointerFromString( getGridPointer("y_vel",      "s") );
 	mVelocityZ      = (float*) pointerFromString( getGridPointer("z_vel",      "s") );
+	mForceX         = (float*) pointerFromString( getGridPointer("x_force",    "s") );
+	mForceY         = (float*) pointerFromString( getGridPointer("y_force",    "s") );
+	mForceZ         = (float*) pointerFromString( getGridPointer("z_force",    "s") );
 	mDensityInflow  = (float*) pointerFromString( getGridPointer("inflow_grid","s") );
 	mFuelInflow     = (float*) pointerFromString( getGridPointer("fuel_inflow","s") );
 	
diff --git a/intern/mantaflow/intern/manta_pp/plugin/extforces.cpp b/intern/mantaflow/intern/manta_pp/plugin/extforces.cpp
index d7a62ad..ef92a8a 100644
--- a/intern/mantaflow/intern/manta_pp/plugin/extforces.cpp
+++ b/intern/mantaflow/intern/manta_pp/plugin/extforces.cpp
@@ -401,6 +401,11 @@ void vorticityConfinement(MACGrid& vel, FlagGrid& flags, Real strength) {
 	KnAddForceField(flags, vel, force);
 } static PyObject* _W_6 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "vorticityConfinement" ); PyObject *_retval = 0; { ArgLocker _lock; MACGrid& vel = *_args.getPtr<MACGrid >("vel",0,&_lock); FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",1,&_lock); Real strength = _args.get<Real >("strength",2,&_lock);   _retval = getPyNone(); vorticityConfinement(vel,flags,strength) [...]
 
+
+void addForceField(FlagGrid& flags, MACGrid& vel, Grid<Vec3>& force) {
+	KnAddForceField(flags, vel, force);
+} static PyObject* _W_7 (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 [...]
+
 } // namespace
 
 
diff --git a/intern/mantaflow/intern/strings/smoke.h b/intern/mantaflow/intern/strings/smoke.h
index 478a5ef..bfa77f7 100644
--- a/intern/mantaflow/intern/strings/smoke.h
+++ b/intern/mantaflow/intern/strings/smoke.h
@@ -88,6 +88,9 @@ z_vel = s.create(RealGrid)\n\
 density = s.create(LevelsetGrid)\n\
 pressure = s.create(RealGrid)\n\
 forces = s.create(MACGrid)\n\
+x_force = s.create(RealGrid)\n\
+y_force = s.create(RealGrid)\n\
+z_force = s.create(RealGrid)\n\
 inflow_grid = s.create(LevelsetGrid)\n\
 fuel_inflow = s.create(LevelsetGrid)\n";
 
@@ -270,6 +273,9 @@ if 'z_vel' in globals() : del z_vel\n\
 if 'density' in globals() : del density\n\
 if 'pressure' in globals() : del pressure\n\
 if 'forces' in globals() : del forces\n\
+if 'x_force' in globals() : del x_force\n\
+if 'y_force' in globals() : del y_force\n\
+if 'z_force' in globals() : del z_force\n\
 if 'inflow_grid' in globals() : del inflow_grid\n\
 if 'fuel_inflow' in globals() : del fuel_inflow\n";
 
@@ -384,6 +390,7 @@ def step_low():\n\
   \n\
   if doOpen:\n\
     resetOutflow(flags=flags, real=density)\n\
+  \n\
   mantaMsg('Vorticity')\n\
   if vorticity > 0.01:\n\
     vorticityConfinement(vel=vel, flags=flags, strength=$VORTICITY$)\n\
@@ -398,14 +405,17 @@ def step_low():\n\
     gravity=vec3(0,0,-0.01 * $ALPHA$) if dim==3 else vec3(0,-0.01* $ALPHA$,0)\n\
     addBuoyancy(density=density, vel=vel, gravity=gravity, flags=flags)\n\
   \n\
+  copyRealToMac(sourceX=x_force, sourceY=y_force, sourceZ=z_force, target=forces)\n\
+  mantaMsg('Adding forces')\n\
+  addForceField(flags=flags, vel=vel, force=forces)\n\
+  forces.clear()\n\
+  \n\
   mantaMsg('Walls')\n\
   setWallBcs(flags=flags, vel=vel)\n\
   \n\
   mantaMsg('Pressure')\n\
   solvePressure(flags=flags, vel=vel, pressure=pressure)\n\
-  # TODO: mantaMsg('Forcefield')\n\
-  # TODO: addForceField(flags=flags, vel=vel, force=forces)\n\
-  # TODO: forces.clear()\n\
+  \n\
   copyMacToReal(source=vel, targetX=x_vel, targetY=y_vel, targetZ=z_vel)\n\
 \n\
 def process_burn_low():\n\
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 932abcb..8315173 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2571,74 +2571,6 @@ static void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds,
 	pdEndEffectors(&effectors);
 }
 
-//void manta_update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
-//{
-//	ListBase *effectors;
-//	/* make sure smoke flow influence is 0.0f */
-//	sds->effector_weights->weight[PFIELD_SMOKEFLOW] = 0.0f;
-//	effectors = pdInitEffectors(scene, ob, NULL, sds->effector_weights, true);
-//	
-//	if (effectors)
-//	{
-//		float *density = smoke_get_density(sds->fluid);
-//		float *fuel = smoke_get_fuel(sds->fluid);
-//		float *force_x = smoke_get_force_x(sds->fluid);
-//		float *force_y = smoke_get_force_y(sds->fluid);
-//		float *force_z = smoke_get_force_z(sds->fluid);
-//		float *velocity_x = smoke_get_velocity_x(sds->fluid);
-//		float *velocity_y = smoke_get_velocity_y(sds->fluid);
-//		float *velocity_z = smoke_get_velocity_z(sds->fluid);
-//		unsigned char *obstacle = smoke_get_obstacle(sds->fluid);
-//		int x;
-//		
-//		// precalculate wind forces
-//#pragma omp parallel for schedule(static)
-//		for (x = 0; x < sds->res[0]; x++)
-//		{
-//			int y, z;
-//			for (y = 0; y < sds->res[1]; y++)
-//				for (z = 0; z < sds->res[2]; z++)
-//				{
-//					EffectedPoint epoint;
-//					float mag;
-//					float voxelCenter[3] = {0, 0, 0}, vel[3] = {0, 0, 0}, retvel[3] = {0, 0, 0};
-//					unsigned int index = smoke_get_index(x, sds->res[0], y, sds->res[1], z);
-//					
-//					vel[0] = velocity_x[index];
-//					vel[1] = velocity_y[index];
-//					vel[2] = velocity_z[index];
-//					
-//					/* convert vel to global space */
-//					mag = len_v3(vel);
-//					mul_mat3_m4_v3(sds->obmat, vel);
-//					normalize_v3(vel);
-//					mul_v3_fl(vel, mag);
-//					
-//					voxelCenter[0] = sds->p0[0] + sds->cell_size[0] * ((float)(x + sds->res_min[0]) + 0.5f);
-//					voxelCenter[1] = sds->p0[1] + sds->cell_size[1] * ((float)(y + sds->res_min[1]) + 0.5f);
-//					voxelCenter[2] = sds->p0[2] + sds->cell_size[2] * ((float)(z + sds->res_min[2]) + 0.5f);
-//					mul_m4_v3(sds->obmat, voxelCenter);
-//					
-//					pd_point_from_loc(scene, voxelCenter, vel, index, &epoint);
-//					pdDoEffectors(effectors, NULL, sds->effector_weights, &epoint, retvel, NULL);
-//					
-//					/* convert retvel to local space */
-//					mag = len_v3(retvel);
-//					mul_mat3_m4_v3(sds->imat, retvel);
-//					normalize_v3(retvel);
-//					mul_v3_fl(retvel, mag);
-//					
-//					// TODO dg - do in force!
-//					force_x[index] = min_ff(max_ff(-1.0f, retvel[0] * 0.2f), 1.0f);
-//					force_y[index] = min_ff(max_ff(-1.0f, retvel[1] * 0.2f), 1.0f);
-//					force_z[index] = min_ff(max_ff(-1.0f, retvel[2] * 0.2f), 1.0f);
-//				}
-//		}
-//	}
-//	
-//	pdEndEffectors(&effectors);
-//}
-
 static void step(Scene *scene, Object *ob, SmokeModifierData *smd, DerivedMesh *domain_dm, float fps, bool for_render)
 {
 	SmokeDomainSettings *sds = smd->domain;
@@ -2713,11 +2645,10 @@ static void step(Scene *scene, Object *ob, SmokeModifierData *smd, DerivedMesh *
 		update_obstacles(scene, ob, sds, dtSubdiv, substep, totalSubsteps);
 
 		if (sds->total_cells > 1) {
-#ifndef WITH_MANTA
 			update_effectors(scene, ob, sds, dtSubdiv); // DG TODO? problem --> uses forces instead of velocity, need to check how they need to be changed with variable dt
+#ifndef WITH_MANTA
 			smoke_step(sds->fluid, gravity, dtSubdiv);
 #else
-//			update_effectors(scene, ob, sds, dtSubdiv); // TODO (sebbas)
 			smoke_step(sds->fluid, smd);
 #endif
 		}




More information about the Bf-blender-cvs mailing list