From adcc9d014cc2ec27fea74168bdb4c47fddedbeb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Barschkis?= Date: Wed, 15 Jan 2020 15:50:02 +0100 Subject: Fluid: Moved grid reset loop for inner obstacle cells from blenkernel code into Mantaflow Having this loop in directly Manta is faster and potentially fixes issues T72783 and T72894. --- intern/mantaflow/extern/manta_fluid_API.h | 4 ++-- intern/mantaflow/intern/MANTA_main.cpp | 8 ++++---- intern/mantaflow/intern/MANTA_main.h | 8 ++++---- intern/mantaflow/intern/manta_fluid_API.cpp | 4 ++-- intern/mantaflow/intern/strings/fluid_script.h | 16 ++++++++++++++-- intern/mantaflow/intern/strings/smoke_script.h | 7 +++++-- 6 files changed, 31 insertions(+), 16 deletions(-) (limited to 'intern/mantaflow') diff --git a/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h index aff3a54501c..691a98f9063 100644 --- a/intern/mantaflow/extern/manta_fluid_API.h +++ b/intern/mantaflow/extern/manta_fluid_API.h @@ -85,8 +85,8 @@ float *manta_get_force_x(struct MANTA *fluid); float *manta_get_force_y(struct MANTA *fluid); float *manta_get_force_z(struct MANTA *fluid); float *manta_get_phiguide_in(struct MANTA *fluid); -int *manta_get_num_obstacle(struct MANTA *fluid); -int *manta_get_num_guide(struct MANTA *fluid); +float *manta_get_num_obstacle(struct MANTA *fluid); +float *manta_get_num_guide(struct MANTA *fluid); int manta_get_res_x(struct MANTA *fluid); int manta_get_res_y(struct MANTA *fluid); int manta_get_res_z(struct MANTA *fluid); diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp index 52d40407e0d..fc309c76b30 100644 --- a/intern/mantaflow/intern/MANTA_main.cpp +++ b/intern/mantaflow/intern/MANTA_main.cpp @@ -2522,10 +2522,6 @@ void MANTA::updatePointers() std::vector> mantaIntObjects; mantaIntObjects.push_back(std::make_tuple(&mObstacle, "flags" + solver_ext, func, true)); - mantaIntObjects.push_back( - std::make_tuple(&mNumObstacle, "numObs" + solver_ext, func, mUsingObstacle)); - mantaIntObjects.push_back( - std::make_tuple(&mNumGuide, "numGuides" + solver_ext, func, mUsingGuiding)); std::vector> mantaFloatObjects; mantaFloatObjects.push_back(std::make_tuple(&mPhiIn, "phiIn" + solver_ext, func, true)); @@ -2559,6 +2555,10 @@ void MANTA::updatePointers() std::make_tuple(&mInVelocityY, "y_invel" + solver_ext, func, mUsingInvel)); mantaFloatObjects.push_back( std::make_tuple(&mInVelocityZ, "z_invel" + solver_ext, func, mUsingInvel)); + mantaFloatObjects.push_back( + std::make_tuple(&mNumObstacle, "numObs" + solver_ext, func, mUsingObstacle)); + mantaFloatObjects.push_back( + std::make_tuple(&mNumGuide, "numGuides" + solver_ext, func, mUsingGuiding)); mantaFloatObjects.push_back(std::make_tuple(&mPhi, "phi" + solver_ext, func, mUsingLiquid)); diff --git a/intern/mantaflow/intern/MANTA_main.h b/intern/mantaflow/intern/MANTA_main.h index 1c18cb8affa..d45f30c9acf 100644 --- a/intern/mantaflow/intern/MANTA_main.h +++ b/intern/mantaflow/intern/MANTA_main.h @@ -248,11 +248,11 @@ struct MANTA { { return mObstacle; } - inline int *getNumObstacle() + inline float *getNumObstacle() { return mNumObstacle; } - inline int *getNumGuide() + inline float *getNumGuide() { return mNumGuide; } @@ -765,8 +765,8 @@ struct MANTA { float *mForceY; float *mForceZ; int *mObstacle; - int *mNumObstacle; - int *mNumGuide; + float *mNumObstacle; + float *mNumGuide; // Smoke grids float *mDensity; diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp b/intern/mantaflow/intern/manta_fluid_API.cpp index 240bbd77085..4c9b5a93fc3 100644 --- a/intern/mantaflow/intern/manta_fluid_API.cpp +++ b/intern/mantaflow/intern/manta_fluid_API.cpp @@ -292,11 +292,11 @@ float *manta_get_phiguide_in(MANTA *fluid) return fluid->getPhiGuideIn(); } -int *manta_get_num_obstacle(MANTA *fluid) +float *manta_get_num_obstacle(MANTA *fluid) { return fluid->getNumObstacle(); } -int *manta_get_num_guide(MANTA *fluid) +float *manta_get_num_guide(MANTA *fluid) { return fluid->getNumGuide(); } diff --git a/intern/mantaflow/intern/strings/fluid_script.h b/intern/mantaflow/intern/strings/fluid_script.h index 565b942c582..b7d3a5a195e 100644 --- a/intern/mantaflow/intern/strings/fluid_script.h +++ b/intern/mantaflow/intern/strings/fluid_script.h @@ -243,7 +243,7 @@ fluid_data_dict_s$ID$ = dict(vel=vel_s$ID$, phiObs=phiObs_s$ID$, phiIn=phiIn_s$I const std::string fluid_alloc_obstacle = "\n\ mantaMsg('Allocating obstacle data')\n\ -numObs_s$ID$ = s$ID$.create(IntGrid)\n\ +numObs_s$ID$ = s$ID$.create(RealGrid)\n\ phiObsIn_s$ID$ = s$ID$.create(LevelsetGrid)\n\ obvel_s$ID$ = s$ID$.create(MACGrid)\n\ obvelC_s$ID$ = s$ID$.create(Vec3Grid)\n\ @@ -259,7 +259,7 @@ const std::string fluid_alloc_guiding = mantaMsg('Allocating guiding data')\n\ velT_s$ID$ = s$ID$.create(MACGrid)\n\ weightGuide_s$ID$ = s$ID$.create(RealGrid)\n\ -numGuides_s$ID$ = s$ID$.create(IntGrid)\n\ +numGuides_s$ID$ = s$ID$.create(RealGrid)\n\ phiGuideIn_s$ID$ = s$ID$.create(LevelsetGrid)\n\ guidevelC_s$ID$ = s$ID$.create(Vec3Grid)\n\ x_guidevel_s$ID$ = s$ID$.create(RealGrid)\n\ @@ -324,9 +324,15 @@ def fluid_pre_step_$ID$():\n\ \n\ # translate obvels (world space) to grid space\n\ if using_obstacle_s$ID$:\n\ + # Average out velocities from multiple obstacle objects at one cell\n\ + x_obvel_s$ID$.safeDivide(numObs_s$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\ 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\ @@ -572,9 +578,15 @@ def bake_guiding_process_$ID$(framenr, format_guiding, path_guiding):\n\ if framenr>1:\n\ fluid_load_guiding_$ID$(path_guiding, framenr-1, format_guiding)\n\ \n\ + # Average out velocities from multiple guiding objects at one cell\n\ + x_guidevel_s$ID$.safeDivide(numGuides_s$ID$)\n\ + 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\ 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\ diff --git a/intern/mantaflow/intern/strings/smoke_script.h b/intern/mantaflow/intern/strings/smoke_script.h index 186f56c0707..3445bd56481 100644 --- a/intern/mantaflow/intern/strings/smoke_script.h +++ b/intern/mantaflow/intern/strings/smoke_script.h @@ -371,6 +371,9 @@ def smoke_step_$ID$():\n\ extrapolateVec3Simple(vel=obvelC_s$ID$, phi=phiObsIn_s$ID$, distance=3, inside=False)\n\ resampleVec3ToMac(source=obvelC_s$ID$, target=obvel_s$ID$)\n\ \n\ + # Cells inside obstacle should not contain any density, fire, etc.\n\ + resetInObstacle(flags=flags_s$ID$, density=density_s$ID$, vel=vel_s$ID$, heat=heat_s$ID$, fuel=fuel_s$ID$, flame=flame_s$ID$, red=color_r_s$ID$, green=color_g_s$ID$, blue=color_b_s$ID$)\n\ + \n\ # add initial velocity\n\ if using_invel_s$ID$:\n\ resampleVec3ToMac(source=invelC_s$ID$, target=invel_s$ID$)\n\ @@ -388,7 +391,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=burningRate_s$ID$, flameSmoke=flameSmoke_s$ID$, ignitionTemp=ignitionTemp_s$ID$, maxTemp=maxTemp_s$ID$, flameSmokeColor=flameSmokeColor_s$ID$)\n\ + processBurn(fuel=fuel_s$ID$, density=density_s$ID$, react=react_s$ID$, red=color_r_s$ID$, green=color_g_s$ID$, blue=color_b_s$ID$, heat=heat_s$ID$, 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\ @@ -503,7 +506,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=burningRate_s$ID$, flameSmoke=flameSmoke_s$ID$, ignitionTemp=ignitionTemp_s$ID$, maxTemp=maxTemp_s$ID$, flameSmokeColor=flameSmokeColor_s$ID$)\n\ + processBurn(fuel=fuel_sn$ID$, density=density_sn$ID$, react=react_sn$ID$, red=color_r_sn$ID$, green=color_g_sn$ID$, blue=color_b_sn$ID$, 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\ -- cgit v1.2.3