[Bf-blender-cvs] [e1aa388135a] fluid-mantaflow: Mantaflow: Big update for liquid simulations

Sebastián Barschkis noreply at git.blender.org
Wed Nov 20 14:40:16 CET 2019


Commit: e1aa388135a915c3ed47099e540003b09542e2a2
Author: Sebastián Barschkis
Date:   Wed Nov 20 14:39:22 2019 +0100
Branches: fluid-mantaflow
https://developer.blender.org/rBe1aa388135a915c3ed47099e540003b09542e2a2

Mantaflow: Big update for liquid simulations

Support for second order obstacles, additional parameters to control liquid behavior (e.g. flip ratio, max/min timesteps)

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

M	intern/mantaflow/intern/MANTA_main.cpp
M	intern/mantaflow/intern/MANTA_main.h
M	intern/mantaflow/intern/strings/fluid_script.h
M	intern/mantaflow/intern/strings/liquid_script.h
M	release/scripts/startup/bl_operators/object_quick_effects.py
M	release/scripts/startup/bl_ui/properties_physics_manta.py
M	source/blender/blenkernel/intern/manta.c
M	source/blender/makesdna/DNA_manta_types.h
M	source/blender/makesrna/intern/rna_manta.c

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

diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp
index 8e0fd3c7e1a..48bf8210c25 100644
--- a/intern/mantaflow/intern/MANTA_main.cpp
+++ b/intern/mantaflow/intern/MANTA_main.cpp
@@ -70,6 +70,7 @@ MANTA::MANTA(int *res, MantaModifierData *mmd) : mCurrentID(++solverID)
   mUsingMesh = mmd->domain->flags & FLUID_DOMAIN_USE_MESH;
   mUsingMVel = mmd->domain->flags & FLUID_DOMAIN_USE_SPEED_VECTORS;
   mUsingGuiding = mmd->domain->flags & FLUID_DOMAIN_USE_GUIDING;
+  mUsingFractions = mmd->domain->flags & FLUID_DOMAIN_USE_FRACTIONS;
   mUsingLiquid = mmd->domain->type == FLUID_DOMAIN_TYPE_LIQUID;
   mUsingSmoke = mmd->domain->type == FLUID_DOMAIN_TYPE_GAS;
   mUsingDrops = mmd->domain->particle_type & FLUID_DOMAIN_PARTICLE_SPRAY;
@@ -208,6 +209,9 @@ MANTA::MANTA(int *res, MantaModifierData *mmd) : mCurrentID(++solverID)
       mResGuiding = (mmd->domain->guiding_parent) ? mmd->domain->guide_res : mmd->domain->res;
       initGuiding(mmd);
     }
+    if (mUsingFractions) {
+      initFractions(mmd);
+    }
     updatePointers();
 
     return;
@@ -445,6 +449,17 @@ void MANTA::initGuiding(MantaModifierData *mmd)
   }
 }
 
+void MANTA::initFractions(MantaModifierData *mmd)
+{
+  std::vector<std::string> pythonCommands;
+  std::string tmpString = fluid_alloc_fractions + fluid_with_fractions;
+  std::string finalString = parseScript(tmpString, mmd);
+  pythonCommands.push_back(finalString);
+
+  runPythonString(pythonCommands);
+  mUsingFractions = true;
+}
+
 void MANTA::initInVelocity(MantaModifierData *mmd)
 {
   if (!mInVelocityX) {
@@ -805,6 +820,17 @@ std::string MANTA::getRealValue(const std::string &varName, MantaModifierData *m
     ss << mmd->time;
   else if (varName == "END_FRAME")
     ss << mmd->domain->cache_frame_end;
+  else if (varName == "SIMULATION_METHOD") {
+    if (mmd->domain->simulation_method & FLUID_DOMAIN_METHOD_FLIP) {
+      ss << "'FLIP'";
+    } else if (mmd->domain->simulation_method & FLUID_DOMAIN_METHOD_APIC) {
+      ss << "'APIC'";
+    } else {
+      ss << "'NONE'";
+    }
+  }
+  else if (varName == "FLIP_RATIO")
+    ss << mmd->domain->flip_ratio;
   else if (varName == "PARTICLE_RANDOMNESS")
     ss << mmd->domain->particle_randomness;
   else if (varName == "PARTICLE_NUMBER")
@@ -815,10 +841,14 @@ std::string MANTA::getRealValue(const std::string &varName, MantaModifierData *m
     ss << mmd->domain->particle_maximum;
   else if (varName == "PARTICLE_RADIUS")
     ss << mmd->domain->particle_radius;
+  else if (varName == "FRACTIONS_THRESHOLD")
+    ss << mmd->domain->fractions_threshold;
   else if (varName == "MESH_CONCAVE_UPPER")
     ss << mmd->domain->mesh_concave_upper;
   else if (varName == "MESH_CONCAVE_LOWER")
     ss << mmd->domain->mesh_concave_lower;
+  else if (varName == "MESH_PARTICLE_RADIUS")
+    ss << mmd->domain->mesh_particle_radius;
   else if (varName == "MESH_SMOOTHEN_POS")
     ss << mmd->domain->mesh_smoothen_pos;
   else if (varName == "MESH_SMOOTHEN_NEG")
@@ -913,6 +943,8 @@ std::string MANTA::getRealValue(const std::string &varName, MantaModifierData *m
     ss << (mmd->domain->flags & FLUID_DOMAIN_USE_ADAPTIVE_TIME ? "True" : "False");
   else if (varName == "USING_SPEEDVECTORS")
     ss << (mmd->domain->flags & FLUID_DOMAIN_USE_SPEED_VECTORS ? "True" : "False");
+  else if (varName == "USING_FRACTIONS")
+    ss << (mmd->domain->flags & FLUID_DOMAIN_USE_FRACTIONS ? "True" : "False");
   else
     std::cout << "ERROR: Unknown option: " << varName << std::endl;
   return ss.str();
diff --git a/intern/mantaflow/intern/MANTA_main.h b/intern/mantaflow/intern/MANTA_main.h
index 2235fddc570..1fdd2a1759a 100644
--- a/intern/mantaflow/intern/MANTA_main.h
+++ b/intern/mantaflow/intern/MANTA_main.h
@@ -72,6 +72,7 @@ struct MANTA {
   void initLiquidMesh(MantaModifierData *mmd);
   void initObstacle(MantaModifierData *mmd);
   void initGuiding(MantaModifierData *mmd);
+  void initFractions(MantaModifierData *mmd);
   void initInVelocity(MantaModifierData *mmd);
   void initOutflow(MantaModifierData *mmd);
   void initSndParts(MantaModifierData *mmd);
@@ -646,6 +647,7 @@ struct MANTA {
   bool mUsingFire;
   bool mUsingObstacle;
   bool mUsingGuiding;
+  bool mUsingFractions;
   bool mUsingInvel;
   bool mUsingOutflow;
   bool mUsingNoise;
diff --git a/intern/mantaflow/intern/strings/fluid_script.h b/intern/mantaflow/intern/strings/fluid_script.h
index e2f08956c07..86ad3777eac 100644
--- a/intern/mantaflow/intern/strings/fluid_script.h
+++ b/intern/mantaflow/intern/strings/fluid_script.h
@@ -112,6 +112,7 @@ using_noise_s$ID$        = $USING_NOISE$\n\
 using_adaptTime_s$ID$    = $USING_ADAPTIVETIME$\n\
 using_obstacle_s$ID$     = $USING_OBSTACLE$\n\
 using_guiding_s$ID$      = $USING_GUIDING$\n\
+using_fractions_s$ID$    = $USING_FRACTIONS$\n\
 using_invel_s$ID$        = $USING_INVEL$\n\
 using_outflow_s$ID$      = $USING_OUTFLOW$\n\
 using_sndparts_s$ID$     = $USING_SNDPARTS$\n\
@@ -137,19 +138,19 @@ const std::string fluid_variables_noise =
     "\n\
 mantaMsg('Fluid variables noise')\n\
 upres_sn$ID$  = $NOISE_SCALE$\n\
-gs_sn$ID$     = vec3($NOISE_RESX$, $NOISE_RESY$, $NOISE_RESZ$)\n";
+gs_sn$ID$     = vec3(upres_sn$ID$*gs_s$ID$.x, upres_sn$ID$*gs_s$ID$.y, upres_sn$ID$*gs_s$ID$.z)\n";
 
 const std::string fluid_variables_mesh =
     "\n\
 mantaMsg('Fluid variables mesh')\n\
 upres_sm$ID$  = $MESH_SCALE$\n\
-gs_sm$ID$     = vec3($MESH_RESX$, $MESH_RESY$, $MESH_RESZ$)\n";
+gs_sm$ID$     = vec3(upres_sm$ID$*gs_s$ID$.x, upres_sm$ID$*gs_s$ID$.y, upres_sm$ID$*gs_s$ID$.z)\n";
 
 const std::string fluid_variables_particles =
     "\n\
 mantaMsg('Fluid variables particles')\n\
 upres_sp$ID$  = $PARTICLE_SCALE$\n\
-gs_sp$ID$     = vec3($PARTICLE_RESX$, $PARTICLE_RESY$, $PARTICLE_RESZ$)\n";
+gs_sp$ID$     = vec3(upres_sp$ID$*gs_s$ID$.x, upres_sp$ID$*gs_s$ID$.y, upres_sp$ID$*gs_s$ID$.z)\n";
 
 const std::string fluid_variables_guiding =
     "\n\
@@ -171,6 +172,10 @@ const std::string fluid_with_guiding =
     "\n\
 using_guiding_s$ID$ = True\n";
 
+const std::string fluid_with_fractions =
+    "\n\
+using_fractions_s$ID$ = True\n";
+
 const std::string fluid_with_invel =
     "\n\
 using_invel_s$ID$ = True\n";
@@ -247,7 +252,7 @@ forces_s$ID$      = s$ID$.create(Vec3Grid)\n\
 x_force_s$ID$     = s$ID$.create(RealGrid)\n\
 y_force_s$ID$     = s$ID$.create(RealGrid)\n\
 z_force_s$ID$     = s$ID$.create(RealGrid)\n\
-obvel_s$ID$       = 0\n\
+obvel_s$ID$       = None\n\
 \n\
 # Keep track of important objects in dict to load them later on\n\
 fluid_data_dict_s$ID$ = dict(vel=vel_s$ID$, phiObs=phiObs_s$ID$, phiIn=phiIn_s$ID$, phiOut=phiOut_s$ID$, flags=flags_s$ID$)\n";
@@ -284,6 +289,11 @@ guidevel_sg$ID$   = sg$ID$.create(MACGrid)\n\
 # Keep track of important objects in dict to load them later on\n\
 fluid_guiding_dict_s$ID$ = dict(guidevel=guidevel_sg$ID$)\n";
 
+const std::string fluid_alloc_fractions =
+    "\n\
+mantaMsg('Allocating fractions data')\n\
+fractions_s$ID$ = s$ID$.create(MACGrid)\n";
+
 const std::string fluid_alloc_invel =
     "\n\
 mantaMsg('Allocating initial velocity data')\n\
diff --git a/intern/mantaflow/intern/strings/liquid_script.h b/intern/mantaflow/intern/strings/liquid_script.h
index d799c9e17f8..e87b4e5ecc6 100644
--- a/intern/mantaflow/intern/strings/liquid_script.h
+++ b/intern/mantaflow/intern/strings/liquid_script.h
@@ -46,8 +46,12 @@ maxParticles_s$ID$     = $PARTICLE_MAXIMUM$\n\
 radiusFactor_s$ID$     = $PARTICLE_RADIUS$\n\
 using_mesh_s$ID$       = $USING_MESH$\n\
 using_final_mesh_s$ID$ = $USING_IMPROVED_MESH$\n\
+using_fractions_s$ID$  = $USING_FRACTIONS$\n\
+fracThreshold_s$ID$    = $FRACTIONS_THRESHOLD$\n\
+flipRatio_s$ID$        = $FLIP_RATIO$\n\
 concaveUpper_s$ID$     = $MESH_CONCAVE_UPPER$\n\
 concaveLower_s$ID$     = $MESH_CONCAVE_LOWER$\n\
+meshRadiusFactor_s$ID$ = $MESH_PARTICLE_RADIUS$\n\
 smoothenPos_s$ID$      = $MESH_SMOOTHEN_POS$\n\
 smoothenNeg_s$ID$      = $MESH_SMOOTHEN_NEG$\n\
 randomness_s$ID$       = $PARTICLE_RANDOMNESS$\n\
@@ -84,10 +88,10 @@ phiParts_s$ID$   = s$ID$.create(LevelsetGrid)\n\
 phi_s$ID$        = s$ID$.create(LevelsetGrid)\n\
 phiTmp_s$ID$     = s$ID$.create(LevelsetGrid)\n\
 curvature_s$ID$  = s$ID$.create(RealGrid)\n\
-fractions_s$ID$  = 0 # s$ID$.create(MACGrid) # TODO (sebbas): disabling fractions for now - not fracwallbcs not supporting obvels yet\n\
 velOld_s$ID$     = s$ID$.create(MACGrid)\n\
 velParts_s$ID$   = s$ID$.create(MACGrid)\n\
 mapWeights_s$ID$ = s$ID$.create(MACGrid)\n\
+fractions_s$ID$  = None # allocated dynamically\n\
 \n\
 pp_s$ID$         = s$ID$.create(BasicParticleSystem)\n\
 pVel_pp$ID$      = pp_s$ID$.create(PdataVec3)\n\
@@ -152,7 +156,7 @@ def liquid_adaptive_step_$ID$(framenr):\n\
     \n\
     fluid_pre_step_$ID$()\n\
     \n\
-    flags_s$ID$.initDomain(boundaryWidth=0, phiWalls=phiObs_s$ID$, outflow=boundConditions_s$ID$) # TODO (sebbas): bwidth=1 for fraction support\n\
+    flags_s$ID$.initDomain(boundaryWidth=1 if using_fractions_s$ID$ else 0, phiWalls=phiObs_s$ID$, outflow=boundConditions_s$ID$)\n\
     \n\
     if using_obstacle_s$ID$:\n\
         mantaMsg('Initializing obstacle levelset')\n\
@@ -178,8 +182,9 @@ def liquid_adaptive_step_$ID$(framenr):\n\
     if using_outflow_s$ID$:\n\
         phiOut_s$ID$.join(phiOutIn_s$ID$)\n\
     \n\
-    #updateFractions(flags=flags_s$ID$, phiObs=phiObs_s$ID$, fractions=fractions_s$ID$, boundaryWidth=boundaryWidth_s$ID$) # TODO (sebbas): uncomment for fraction support\n\
-    setObstacleFlags(flags=flags_s$ID$, phiObs=phiObs_s$ID$, phiOut=phiOut_s$ID$)#, fractions=fractions_s$ID$)\n\
+    if using_fractions_s$ID$:\n\
+        updateFractions(flags=flags_s$ID$, phiObs=phiObs_s$ID$, fractions=fractions_s$ID$, boundaryWidth=boundaryWidth_s$ID$, fracThreshold=fracThreshold_s$ID$)\n\
+    setObstacleFlags(flags=flags_s$ID$, phiObs=phiObs_s$ID$, phiOut=phiOut_s$ID$, fractions=fractions_s$ID$, phiIn=phiIn_s$ID$)\n\
     \n\
     # add initial velocity: set invel as source grid to ensure const vels in inflow region, sampling makes use of this\n\
     if using_invel_s$ID$:\n\
@@ -217,7 +222,7 @@ def liquid_step_$ID$():\n\
     \n\
     # create level set of particles\n\
     gridParticleIndex(parts=pp_s$ID$, flags=fla

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list