Fluid: Refactored fluid gravity settings
Refactored setup that converts from Blender to Mantaflow units.
This commit is contained in:
parent
c4a850b7c2
commit
21485e94aa
Notes:
blender-bot
2023-02-14 06:17:14 +01:00
Referenced by commit 31d3f034ab
, Fix T76097: Simulations don't take animated gravity into account
Referenced by issue #77827, Mantaflow - liquid refuses to rise above level of inflow object
Referenced by issue #76276, Compiler Error C1061 due to too many nested if/else in MANTA_main.cpp
Referenced by issue #73837, Mantaflow: Effect of forces increases over time.
|
@ -711,6 +711,8 @@ std::string MANTA::getRealValue(const std::string &varName, FluidModifierData *m
|
|||
ss << mResZ;
|
||||
}
|
||||
}
|
||||
else if (varName == "TIME_SCALE")
|
||||
ss << mmd->domain->time_scale;
|
||||
else if (varName == "FRAME_LENGTH")
|
||||
ss << mmd->domain->frame_length;
|
||||
else if (varName == "CFL")
|
||||
|
|
|
@ -92,7 +92,7 @@ const std::string fluid_variables =
|
|||
mantaMsg('Fluid variables')\n\
|
||||
dim_s$ID$ = $SOLVER_DIM$\n\
|
||||
res_s$ID$ = $RES$\n\
|
||||
gravity_s$ID$ = vec3($GRAVITY_X$, $GRAVITY_Y$, $GRAVITY_Z$)\n\
|
||||
gravity_s$ID$ = vec3($GRAVITY_X$, $GRAVITY_Y$, $GRAVITY_Z$) # in SI unit (e.g. m/s^2)\n\
|
||||
gs_s$ID$ = vec3($RESX$, $RESY$, $RESZ$)\n\
|
||||
maxVel_s$ID$ = 0\n\
|
||||
\n\
|
||||
|
@ -115,6 +115,7 @@ using_speedvectors_s$ID$ = $USING_SPEEDVECTORS$\n\
|
|||
using_diffusion_s$ID$ = $USING_DIFFUSION$\n\
|
||||
\n\
|
||||
# Fluid time params\n\
|
||||
timeScale_s$ID$ = $TIME_SCALE$\n\
|
||||
timeTotal_s$ID$ = $TIME_TOTAL$\n\
|
||||
timePerFrame_s$ID$ = $TIME_PER_FRAME$\n\
|
||||
frameLength_s$ID$ = $FRAME_LENGTH$\n\
|
||||
|
@ -132,8 +133,29 @@ end_frame_s$ID$ = $END_FRAME$\n\
|
|||
domainSize_s$ID$ = $FLUID_DOMAIN_SIZE$ # longest domain side in meters\n\
|
||||
viscosity_s$ID$ = $FLUID_VISCOSITY$ / (domainSize_s$ID$*domainSize_s$ID$) # kinematic viscosity in m^2/s\n\
|
||||
\n\
|
||||
# Factor to convert blender velocities to manta velocities\n\
|
||||
toMantaUnitsFac_s$ID$ = (1.0 / (1.0 / res_s$ID$))\n # = dt/dx * 1/dt ";
|
||||
# Factors to convert Blender units to Manta units\n\
|
||||
ratioMetersToRes_s$ID$ = float(domainSize_s$ID$) / float(res_s$ID$) # [meters / cells]\n\
|
||||
mantaMsg('1 Mantaflow cell is ' + str(ratioMetersToRes_s$ID$) + ' Blender length units long.')\n\
|
||||
\n\
|
||||
ratioResToBLength_s$ID$ = float(res_s$ID$) / float(domainSize_s$ID$) # [cells / blength] (blength: cm, m, or km, ... )\n\
|
||||
mantaMsg('1 Blender length unit is ' + str(ratioResToBLength_s$ID$) + ' Mantaflow cells long.')\n\
|
||||
\n\
|
||||
ratioBTimeToTimstep_s$ID$ = float(1) / float(0.1 * 25 * timeScale_s$ID$) # the time within 1 blender time unit, see also fluid.c\n\
|
||||
mantaMsg('1 Blender time unit is ' + str(ratioBTimeToTimstep_s$ID$) + ' Mantaflow time units long.')\n\
|
||||
\n\
|
||||
ratioFrameToFramelength_s$ID$ = float(1) / float(frameLength_s$ID$) # the time within 1 frame\n\
|
||||
mantaMsg('frame / frameLength is ' + str(ratioFrameToFramelength_s$ID$) + ' Mantaflow time units long.')\n\
|
||||
\n\
|
||||
scaleAcceleration_s$ID$ = ratioResToBLength_s$ID$ * (ratioBTimeToTimstep_s$ID$**2)# [meters/btime^2] to [cells/timestep^2] (btime: sec, min, or h, ...)\n\
|
||||
mantaMsg('scaleAcceleration is ' + str(scaleAcceleration_s$ID$))\n\
|
||||
\n\
|
||||
scaleSpeedFrames_s$ID$ = ratioResToBLength_s$ID$ * ratioFrameToFramelength_s$ID$ # [blength/frame] to [cells/frameLength]\n\
|
||||
mantaMsg('scaleSpeed is ' + str(scaleSpeedFrames_s$ID$))\n\
|
||||
\n\
|
||||
scaleSpeedTime_s$ID$ = ratioResToBLength_s$ID$ * ratioBTimeToTimstep_s$ID$ # [blength/btime] to [cells/frameLength]\n\
|
||||
mantaMsg('scaleSpeedTime is ' + str(scaleSpeedTime_s$ID$))\n\
|
||||
\n\
|
||||
gravity_s$ID$ *= scaleAcceleration_s$ID$ # scale from world acceleration to cell based acceleration\n";
|
||||
|
||||
const std::string fluid_variables_noise =
|
||||
"\n\
|
||||
|
@ -342,17 +364,16 @@ def fluid_pre_step_$ID$():\n\
|
|||
y_obvel_s$ID$.safeDivide(numObs_s$ID$)\n\
|
||||
z_obvel_s$ID$.safeDivide(numObs_s$ID$)\n\
|
||||
\n\
|
||||
x_obvel_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
y_obvel_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
z_obvel_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
\n\
|
||||
x_obvel_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
y_obvel_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
z_obvel_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
copyRealToVec3(sourceX=x_obvel_s$ID$, sourceY=y_obvel_s$ID$, sourceZ=z_obvel_s$ID$, target=obvelC_s$ID$)\n\
|
||||
\n\
|
||||
# translate invels (world space) to grid space\n\
|
||||
if using_invel_s$ID$:\n\
|
||||
x_invel_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
y_invel_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
z_invel_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
x_invel_s$ID$.multConst(scaleSpeedTime_s$ID$)\n\
|
||||
y_invel_s$ID$.multConst(scaleSpeedTime_s$ID$)\n\
|
||||
z_invel_s$ID$.multConst(scaleSpeedTime_s$ID$)\n\
|
||||
copyRealToVec3(sourceX=x_invel_s$ID$, sourceY=y_invel_s$ID$, sourceZ=z_invel_s$ID$, target=invelC_s$ID$)\n\
|
||||
\n\
|
||||
if using_guiding_s$ID$:\n\
|
||||
|
@ -362,9 +383,9 @@ def fluid_pre_step_$ID$():\n\
|
|||
velT_s$ID$.multConst(vec3(gamma_sg$ID$))\n\
|
||||
\n\
|
||||
# translate external forces (world space) to grid space\n\
|
||||
x_force_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
y_force_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
z_force_s$ID$.multConst(toMantaUnitsFac_s$ID$)\n\
|
||||
x_force_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
y_force_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
z_force_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
copyRealToVec3(sourceX=x_force_s$ID$, sourceY=y_force_s$ID$, sourceZ=z_force_s$ID$, target=forces_s$ID$)\n\
|
||||
\n\
|
||||
# If obstacle has velocity, i.e. is a moving obstacle, switch to dynamic preconditioner\n\
|
||||
|
@ -598,10 +619,9 @@ def bake_guiding_process_$ID$(framenr, format_guiding, path_guiding, resumable):
|
|||
y_guidevel_s$ID$.safeDivide(numGuides_s$ID$)\n\
|
||||
z_guidevel_s$ID$.safeDivide(numGuides_s$ID$)\n\
|
||||
\n\
|
||||
x_guidevel_s$ID$.multConst(Real(toMantaUnitsFac_s$ID$))\n\
|
||||
y_guidevel_s$ID$.multConst(Real(toMantaUnitsFac_s$ID$))\n\
|
||||
z_guidevel_s$ID$.multConst(Real(toMantaUnitsFac_s$ID$))\n\
|
||||
\n\
|
||||
x_guidevel_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
y_guidevel_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
z_guidevel_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
copyRealToVec3(sourceX=x_guidevel_s$ID$, sourceY=y_guidevel_s$ID$, sourceZ=z_guidevel_s$ID$, target=guidevelC_s$ID$)\n\
|
||||
\n\
|
||||
mantaMsg('Extrapolating guiding velocity')\n\
|
||||
|
|
|
@ -67,8 +67,7 @@ lMax_sp$ID$ = $SNDPARTICLE_L_MAX$\n\
|
|||
c_s_sp$ID$ = 0.4 # classification constant for snd parts\n\
|
||||
c_b_sp$ID$ = 0.77 # classification constant for snd parts\n\
|
||||
pot_radius_sp$ID$ = $SNDPARTICLE_POTENTIAL_RADIUS$\n\
|
||||
update_radius_sp$ID$ = $SNDPARTICLE_UPDATE_RADIUS$\n\
|
||||
scaleFromManta_sp$ID$ = $FLUID_DOMAIN_SIZE$ / float(res_s$ID$) # resize factor for snd parts\n";
|
||||
update_radius_sp$ID$ = $SNDPARTICLE_UPDATE_RADIUS$\n";
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// GRIDS & MESH & PARTICLESYSTEM
|
||||
|
@ -263,7 +262,7 @@ def liquid_step_$ID$():\n\
|
|||
velOld_s$ID$.copyFrom(vel_s$ID$)\n\
|
||||
\n\
|
||||
# forces & pressure solve\n\
|
||||
addGravity(flags=flags_s$ID$, vel=vel_s$ID$, gravity=gravity_s$ID$)\n\
|
||||
addGravity(flags=flags_s$ID$, vel=vel_s$ID$, gravity=gravity_s$ID$, scale=False)\n\
|
||||
\n\
|
||||
mantaMsg('Adding external forces')\n\
|
||||
addForceField(flags=flags_s$ID$, vel=vel_s$ID$, force=forces_s$ID$)\n\
|
||||
|
@ -371,7 +370,7 @@ def liquid_step_particles_$ID$():\n\
|
|||
flags_sp$ID$.updateFromLevelset(levelset=phi_sp$ID$)\n\
|
||||
\n\
|
||||
# Actual secondary particle simulation\n\
|
||||
flipComputeSecondaryParticlePotentials(potTA=trappedAir_sp$ID$, potWC=waveCrest_sp$ID$, potKE=kineticEnergy_sp$ID$, neighborRatio=neighborRatio_sp$ID$, flags=flags_sp$ID$, v=vel_sp$ID$, normal=normal_sp$ID$, phi=phi_sp$ID$, radius=pot_radius_sp$ID$, tauMinTA=tauMin_ta_sp$ID$, tauMaxTA=tauMax_ta_sp$ID$, tauMinWC=tauMin_wc_sp$ID$, tauMaxWC=tauMax_wc_sp$ID$, tauMinKE=tauMin_k_sp$ID$, tauMaxKE=tauMax_k_sp$ID$, scaleFromManta=scaleFromManta_sp$ID$)\n\
|
||||
flipComputeSecondaryParticlePotentials(potTA=trappedAir_sp$ID$, potWC=waveCrest_sp$ID$, potKE=kineticEnergy_sp$ID$, neighborRatio=neighborRatio_sp$ID$, flags=flags_sp$ID$, v=vel_sp$ID$, normal=normal_sp$ID$, phi=phi_sp$ID$, radius=pot_radius_sp$ID$, tauMinTA=tauMin_ta_sp$ID$, tauMaxTA=tauMax_ta_sp$ID$, tauMinWC=tauMin_wc_sp$ID$, tauMaxWC=tauMax_wc_sp$ID$, tauMinKE=tauMin_k_sp$ID$, tauMaxKE=tauMax_k_sp$ID$, scaleFromManta=ratioMetersToRes_s$ID$)\n\
|
||||
flipSampleSecondaryParticles(mode='single', flags=flags_sp$ID$, v=vel_sp$ID$, pts_sec=ppSnd_sp$ID$, v_sec=pVelSnd_pp$ID$, l_sec=pLifeSnd_pp$ID$, lMin=lMin_sp$ID$, lMax=lMax_sp$ID$, potTA=trappedAir_sp$ID$, potWC=waveCrest_sp$ID$, potKE=kineticEnergy_sp$ID$, neighborRatio=neighborRatio_sp$ID$, c_s=c_s_sp$ID$, c_b=c_b_sp$ID$, k_ta=k_ta_sp$ID$, k_wc=k_wc_sp$ID$, dt=sp$ID$.timestep)\n\
|
||||
flipUpdateSecondaryParticles(mode='linear', pts_sec=ppSnd_sp$ID$, v_sec=pVelSnd_pp$ID$, l_sec=pLifeSnd_pp$ID$, f_sec=pForceSnd_pp$ID$, flags=flags_sp$ID$, v=vel_sp$ID$, neighborRatio=neighborRatio_sp$ID$, radius=update_radius_sp$ID$, gravity=gravity_s$ID$, k_b=k_b_sp$ID$, k_d=k_d_sp$ID$, c_s=c_s_sp$ID$, c_b=c_b_sp$ID$, dt=sp$ID$.timestep)\n\
|
||||
if $SNDPARTICLE_BOUNDARY_PUSHOUT$:\n\
|
||||
|
|
|
@ -376,9 +376,9 @@ def smoke_step_$ID$():\n\
|
|||
\n\
|
||||
if using_heat_s$ID$:\n\
|
||||
mantaMsg('Adding heat buoyancy')\n\
|
||||
addBuoyancy(flags=flags_s$ID$, density=heat_s$ID$, vel=vel_s$ID$, gravity=gravity_s$ID$, coefficient=buoyancy_heat_s$ID$)\n\
|
||||
addBuoyancy(flags=flags_s$ID$, density=heat_s$ID$, vel=vel_s$ID$, gravity=gravity_s$ID$, coefficient=buoyancy_heat_s$ID$, scale=False)\n\
|
||||
mantaMsg('Adding buoyancy')\n\
|
||||
addBuoyancy(flags=flags_s$ID$, density=density_s$ID$, vel=vel_s$ID$, gravity=gravity_s$ID$, coefficient=buoyancy_dens_s$ID$)\n\
|
||||
addBuoyancy(flags=flags_s$ID$, density=density_s$ID$, vel=vel_s$ID$, gravity=gravity_s$ID$, coefficient=buoyancy_dens_s$ID$, scale=False)\n\
|
||||
\n\
|
||||
mantaMsg('Adding forces')\n\
|
||||
addForceField(flags=flags_s$ID$, vel=vel_s$ID$, force=forces_s$ID$)\n\
|
||||
|
|
|
@ -491,32 +491,6 @@ static void manta_set_domain_from_mesh(FluidDomainSettings *mds,
|
|||
mds->cell_size[2] /= (float)mds->base_res[2];
|
||||
}
|
||||
|
||||
static void manta_set_domain_gravity(Scene *scene, FluidDomainSettings *mds)
|
||||
{
|
||||
const float normalization_factor = 1.0f / 9.81f;
|
||||
|
||||
/* Use global gravity if enabled. */
|
||||
if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
|
||||
float gravity[3];
|
||||
copy_v3_v3(gravity, scene->physics_settings.gravity);
|
||||
/* Map default value to 1.0. */
|
||||
mul_v3_fl(gravity, normalization_factor);
|
||||
|
||||
/* Convert gravity to domain space. */
|
||||
float gravity_mag = len_v3(gravity);
|
||||
mul_mat3_m4_v3(mds->imat, gravity);
|
||||
normalize_v3(gravity);
|
||||
mul_v3_fl(gravity, gravity_mag);
|
||||
|
||||
copy_v3_v3(mds->gravity, gravity);
|
||||
}
|
||||
else {
|
||||
mul_v3_fl(mds->gravity, normalization_factor);
|
||||
}
|
||||
|
||||
mul_v3_fl(mds->gravity, mds->effector_weights->global_gravity);
|
||||
}
|
||||
|
||||
static bool BKE_fluid_modifier_init(
|
||||
FluidModifierData *mmd, Depsgraph *depsgraph, Object *ob, Scene *scene, Mesh *me)
|
||||
{
|
||||
|
@ -527,8 +501,11 @@ static bool BKE_fluid_modifier_init(
|
|||
int res[3];
|
||||
/* Set domain dimensions from mesh. */
|
||||
manta_set_domain_from_mesh(mds, ob, me, true);
|
||||
/* Set domain gravity. */
|
||||
manta_set_domain_gravity(scene, mds);
|
||||
/* Set domain gravity, use global gravity if enabled. */
|
||||
if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
|
||||
copy_v3_v3(mds->gravity, scene->physics_settings.gravity);
|
||||
}
|
||||
mul_v3_fl(mds->gravity, mds->effector_weights->global_gravity);
|
||||
/* Reset domain values. */
|
||||
zero_v3_int(mds->shift);
|
||||
zero_v3(mds->shift_f);
|
||||
|
@ -1996,9 +1973,9 @@ static void sample_mesh(FluidFlowSettings *mfs,
|
|||
normalize_v3(hit_normal);
|
||||
|
||||
/* Apply normal directional velocity. */
|
||||
velocity_map[index * 3] += hit_normal[0] * mfs->vel_normal * 0.25f;
|
||||
velocity_map[index * 3 + 1] += hit_normal[1] * mfs->vel_normal * 0.25f;
|
||||
velocity_map[index * 3 + 2] += hit_normal[2] * mfs->vel_normal * 0.25f;
|
||||
velocity_map[index * 3] += hit_normal[0] * mfs->vel_normal;
|
||||
velocity_map[index * 3 + 1] += hit_normal[1] * mfs->vel_normal;
|
||||
velocity_map[index * 3 + 2] += hit_normal[2] * mfs->vel_normal;
|
||||
}
|
||||
/* Apply object velocity. */
|
||||
if (has_velocity && mfs->vel_multi) {
|
||||
|
|
|
@ -2467,7 +2467,7 @@ static void rna_def_fluid_flow_settings(BlenderRNA *brna)
|
|||
RNA_def_property_ui_text(prop, "Random", "Amount of random velocity");
|
||||
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_Fluid_flow_reset");
|
||||
|
||||
prop = RNA_def_property(srna, "velocity_coord", PROP_FLOAT, PROP_XYZ);
|
||||
prop = RNA_def_property(srna, "velocity_coord", PROP_FLOAT, PROP_VELOCITY);
|
||||
RNA_def_property_float_sdna(prop, NULL, "vel_coord");
|
||||
RNA_def_property_array(prop, 3);
|
||||
RNA_def_property_range(prop, -1000.1, 1000.1);
|
||||
|
|
Loading…
Reference in New Issue