[Bf-blender-cvs] [8e5f736] fluid-mantaflow: implemented external forces
SebastiaÌ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