[Bf-blender-cvs] [aaa0cecb2ca] fluid-mantaflow: Mantaflow: Added flame vorticity functionality
Sebastián Barschkis
noreply at git.blender.org
Tue Nov 26 22:02:23 CET 2019
Commit: aaa0cecb2ca511d9e441df9504eb1e68b50e4410
Author: Sebastián Barschkis
Date: Mon Nov 25 21:22:32 2019 +0100
Branches: fluid-mantaflow
https://developer.blender.org/rBaaa0cecb2ca511d9e441df9504eb1e68b50e4410
Mantaflow: Added flame vorticity functionality
===================================================================
M extern/mantaflow/preprocessed/plugin/extforces.cpp
M intern/mantaflow/intern/MANTA_main.cpp
M intern/mantaflow/intern/strings/smoke_script.h
===================================================================
diff --git a/extern/mantaflow/preprocessed/plugin/extforces.cpp b/extern/mantaflow/preprocessed/plugin/extforces.cpp
index 7073af2bd8d..3e1e5733257 100644
--- a/extern/mantaflow/preprocessed/plugin/extforces.cpp
+++ b/extern/mantaflow/preprocessed/plugin/extforces.cpp
@@ -1241,8 +1241,12 @@ void PbRegister_setInitialVelocity()
//! Kernel: gradient norm operator
struct KnConfForce : public KernelBase {
- KnConfForce(Grid<Vec3> &force, const Grid<Real> &grid, const Grid<Vec3> &curl, Real str)
- : KernelBase(&force, 1), force(force), grid(grid), curl(curl), str(str)
+ KnConfForce(Grid<Vec3> &force,
+ const Grid<Real> &grid,
+ const Grid<Vec3> &curl,
+ Real str,
+ const Grid<Real> *strGrid)
+ : KernelBase(&force, 1), force(force), grid(grid), curl(curl), str(str), strGrid(strGrid)
{
runMessage();
run();
@@ -1253,7 +1257,8 @@ struct KnConfForce : public KernelBase {
Grid<Vec3> &force,
const Grid<Real> &grid,
const Grid<Vec3> &curl,
- Real str) const
+ Real str,
+ const Grid<Real> *strGrid) const
{
Vec3 grad = 0.5 * Vec3(grid(i + 1, j, k) - grid(i - 1, j, k),
grid(i, j + 1, k) - grid(i, j - 1, k),
@@ -1261,6 +1266,8 @@ struct KnConfForce : public KernelBase {
if (grid.is3D())
grad[2] = 0.5 * (grid(i, j, k + 1) - grid(i, j, k - 1));
normalize(grad);
+ if (strGrid)
+ str += (*strGrid)(i, j, k);
force(i, j, k) = str * cross(grad, curl(i, j, k));
}
inline Grid<Vec3> &getArg0()
@@ -1283,6 +1290,11 @@ struct KnConfForce : public KernelBase {
return str;
}
typedef Real type3;
+ inline const Grid<Real> *getArg4()
+ {
+ return strGrid;
+ }
+ typedef Grid<Real> type4;
void runMessage()
{
debMsg("Executing kernel KnConfForce ", 3);
@@ -1298,13 +1310,13 @@ struct KnConfForce : public KernelBase {
for (int k = __r.begin(); k != (int)__r.end(); k++)
for (int j = 1; j < _maxY; j++)
for (int i = 1; i < _maxX; i++)
- op(i, j, k, force, grid, curl, str);
+ op(i, j, k, force, grid, curl, str, strGrid);
}
else {
const int k = 0;
for (int j = __r.begin(); j != (int)__r.end(); j++)
for (int i = 1; i < _maxX; i++)
- op(i, j, k, force, grid, curl, str);
+ op(i, j, k, force, grid, curl, str, strGrid);
}
}
void run()
@@ -1318,9 +1330,13 @@ struct KnConfForce : public KernelBase {
const Grid<Real> &grid;
const Grid<Vec3> &curl;
Real str;
+ const Grid<Real> *strGrid;
};
-void vorticityConfinement(MACGrid &vel, const FlagGrid &flags, Real strength)
+void vorticityConfinement(MACGrid &vel,
+ const FlagGrid &flags,
+ Real strengthGlobal = 0,
+ const Grid<Real> *strengthCell = NULL)
{
Grid<Vec3> velCenter(flags.getParent()), curl(flags.getParent()), force(flags.getParent());
Grid<Real> norm(flags.getParent());
@@ -1328,7 +1344,7 @@ void vorticityConfinement(MACGrid &vel, const FlagGrid &flags, Real strength)
GetCentered(velCenter, vel);
CurlOp(velCenter, curl);
GridNorm(norm, curl);
- KnConfForce(force, norm, curl, strength);
+ KnConfForce(force, norm, curl, strengthGlobal, strengthCell);
KnApplyForceField(flags, vel, force, NULL, true, false);
}
static PyObject *_W_8(PyObject *_self, PyObject *_linargs, PyObject *_kwds)
@@ -1343,9 +1359,11 @@ static PyObject *_W_8(PyObject *_self, PyObject *_linargs, PyObject *_kwds)
ArgLocker _lock;
MACGrid &vel = *_args.getPtr<MACGrid>("vel", 0, &_lock);
const FlagGrid &flags = *_args.getPtr<FlagGrid>("flags", 1, &_lock);
- Real strength = _args.get<Real>("strength", 2, &_lock);
+ Real strengthGlobal = _args.getOpt<Real>("strengthGlobal", 2, 0, &_lock);
+ const Grid<Real> *strengthCell = _args.getPtrOpt<Grid<Real>>(
+ "strengthCell", 3, NULL, &_lock);
_retval = getPyNone();
- vorticityConfinement(vel, flags, strength);
+ vorticityConfinement(vel, flags, strengthGlobal, strengthCell);
_args.check();
}
pbFinalizePlugin(parent, "vorticityConfinement", !noTiming);
diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp
index 0fb1bb926cd..cf66dd438f0 100644
--- a/intern/mantaflow/intern/MANTA_main.cpp
+++ b/intern/mantaflow/intern/MANTA_main.cpp
@@ -690,6 +690,8 @@ std::string MANTA::getRealValue(const std::string &varName, MantaModifierData *m
ss << mmd->domain->time_per_frame;
else if (varName == "VORTICITY")
ss << mmd->domain->vorticity / mConstantScaling;
+ else if (varName == "FLAME_VORTICITY")
+ ss << mmd->domain->flame_vorticity / mConstantScaling;
else if (varName == "NOISE_SCALE")
ss << mmd->domain->noise_scale;
else if (varName == "MESH_SCALE")
diff --git a/intern/mantaflow/intern/strings/smoke_script.h b/intern/mantaflow/intern/strings/smoke_script.h
index adf975f66b5..ca60ff068ff 100644
--- a/intern/mantaflow/intern/strings/smoke_script.h
+++ b/intern/mantaflow/intern/strings/smoke_script.h
@@ -46,7 +46,13 @@ buoyancy_dens_s$ID$ = float($BUOYANCY_ALPHA$) / float($FLUID_DOMAIN_SIZE$)\n
buoyancy_heat_s$ID$ = float($BUOYANCY_BETA$) / float($FLUID_DOMAIN_SIZE$)\n\
dissolveSpeed_s$ID$ = $DISSOLVE_SPEED$\n\
using_logdissolve_s$ID$ = $USING_LOG_DISSOLVE$\n\
-using_dissolve_s$ID$ = $USING_DISSOLVE$\n";
+using_dissolve_s$ID$ = $USING_DISSOLVE$\n\
+flameVorticity_s$ID$ = $FLAME_VORTICITY$\n\
+burningRate_s$ID$ = $BURNING_RATE$\n\
+flameSmoke_s$ID$ = $FLAME_SMOKE$\n\
+ignitionTemp_s$ID$ = $IGNITION_TEMP$\n\
+maxTemp_s$ID$ = $MAX_TEMP$\n\
+flameSmokeColor_s$ID$ = vec3($FLAME_SMOKE_COLOR_X$,$FLAME_SMOKE_COLOR_Y$,$FLAME_SMOKE_COLOR_Z$)\n";
const std::string smoke_variables_noise =
"\n\
@@ -330,7 +336,10 @@ def smoke_step_$ID$():\n\
resetOutflow(flags=flags_s$ID$, real=density_s$ID$)\n\
\n\
mantaMsg('Vorticity')\n\
- vorticityConfinement(vel=vel_s$ID$, flags=flags_s$ID$, strength=vorticity_s$ID$)\n\
+ if using_fire_s$ID$:\n\
+ flame_s$ID$.copyFrom(fuel_s$ID$) # temporarily misuse flame grid as vorticity storage\n\
+ flame_s$ID$.multConst(flameVorticity_s$ID$)\n\
+ vorticityConfinement(vel=vel_s$ID$, flags=flags_s$ID$, strengthGlobal=vorticity_s$ID$, strengthCell=None if using_fire_s$ID$ else None)\n\
\n\
if using_heat_s$ID$:\n\
mantaMsg('Adding heat buoyancy')\n\
@@ -365,7 +374,7 @@ def smoke_step_$ID$():\n\
\n\
def process_burn_$ID$():\n\
mantaMsg('Process burn')\n\
- processBurn(fuel=fuel_s$ID$, density=density_s$ID$, react=react_s$ID$, red=color_r_s$ID$ if using_colors_s$ID$ else None, green=color_g_s$ID$ if using_colors_s$ID$ else None, blue=color_b_s$ID$ if using_colors_s$ID$ else None, heat=heat_s$ID$ if using_heat_s$ID$ else None, burningRate=$BURNING_RATE$, flameSmoke=$FLAME_SMOKE$, ignitionTemp=$IGNITION_TEMP$, maxTemp=$MAX_TEMP$, flameSmokeColor=vec3($FLAME_SMOKE_COLOR_X$,$FLAME_SMOKE_COLOR_Y$,$FLAME_SMOKE_COLOR_Z$))\n\
+ processBurn(fuel=fuel_s$ID$, density=density_s$ID$, react=react_s$ID$, red=color_r_s$ID$ if using_colors_s$ID$ else None, green=color_g_s$ID$ if using_colors_s$ID$ else None, blue=color_b_s$ID$ if using_colors_s$ID$ else None, heat=heat_s$ID$ if using_heat_s$ID$ else None, burningRate=burningRate_s$ID$, flameSmoke=flameSmoke_s$ID$, ignitionTemp=ignitionTemp_s$ID$, maxTemp=maxTemp_s$ID$, flameSmokeColor=flameSmokeColor_s$ID$)\n\
\n\
def update_flame_$ID$():\n\
mantaMsg('Update flame')\n\
@@ -478,7 +487,7 @@ def step_noise_$ID$():\n\
\n\
def process_burn_noise_$ID$():\n\
mantaMsg('Process burn noise')\n\
- processBurn(fuel=fuel_sn$ID$, density=density_sn$ID$, react=react_sn$ID$, red=color_r_sn$ID$ if using_colors_s$ID$ else None, green=color_g_sn$ID$ if using_colors_s$ID$ else None, blue=color_b_sn$ID$ if using_colors_s$ID$ else None, burningRate=$BURNING_RATE$, flameSmoke=$FLAME_SMOKE$, ignitionTemp=$IGNITION_TEMP$, maxTemp=$MAX_TEMP$, flameSmokeColor=vec3($FLAME_SMOKE_COLOR_X$,$FLAME_SMOKE_COLOR_Y$,$FLAME_SMOKE_COLOR_Z$))\n\
+ processBurn(fuel=fuel_sn$ID$, density=density_sn$ID$, react=react_sn$ID$, red=color_r_sn$ID$ if using_colors_s$ID$ else None, green=color_g_sn$ID$ if using_colors_s$ID$ else None, blue=color_b_sn$ID$ if using_colors_s$ID$ else None, burningRate=burningRate_s$ID$, flameSmoke=flameSmoke_s$ID$, ignitionTemp=ignitionTemp_s$ID$, maxTemp=maxTemp_s$ID$, flameSmokeColor=flameSmokeColor_s$ID$)\n\
\n\
def update_flame_noise_$ID$():\n\
mantaMsg('Update flame noise')\n\
More information about the Bf-blender-cvs
mailing list