[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