[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