[Bf-blender-cvs] [bfdc42d9906] master: Fluid: Refactored MANTA class

Sebastián Barschkis noreply at git.blender.org
Fri Apr 3 17:49:15 CEST 2020


Commit: bfdc42d9906a08ecc8033eeb9fe267e0a7e5265b
Author: Sebastián Barschkis
Date:   Thu Apr 2 13:48:50 2020 +0200
Branches: master
https://developer.blender.org/rBbfdc42d9906a08ecc8033eeb9fe267e0a7e5265b

Fluid: Refactored MANTA class

Refactored the caching system so that return values are no longer ignored. The aim of this refactor was to make the caching more robust.

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

M	intern/mantaflow/intern/MANTA_main.cpp
M	intern/mantaflow/intern/MANTA_main.h

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

diff --git a/intern/mantaflow/intern/MANTA_main.cpp b/intern/mantaflow/intern/MANTA_main.cpp
index d14ab8d6dd3..3555e098caf 100644
--- a/intern/mantaflow/intern/MANTA_main.cpp
+++ b/intern/mantaflow/intern/MANTA_main.cpp
@@ -48,7 +48,6 @@
 
 #include "MEM_guardedalloc.h"
 
-std::atomic<bool> MANTA::mantaInitialized(false);
 std::atomic<int> MANTA::solverID(0);
 int MANTA::with_debug(0);
 
@@ -523,6 +522,7 @@ MANTA::~MANTA()
   // Destruction string for Python
   std::string tmpString = "";
   std::vector<std::string> pythonCommands;
+  bool result = false;
 
   tmpString += manta_import;
   tmpString += fluid_delete_all;
@@ -530,11 +530,15 @@ MANTA::~MANTA()
   // Leave out mmd argument in parseScript since only looking up IDs
   std::string finalString = parseScript(tmpString);
   pythonCommands.push_back(finalString);
-  runPythonString(pythonCommands);
+  result = runPythonString(pythonCommands);
+
+  assert(result);
+  (void)result;  // not needed in release
 }
 
-void MANTA::runPythonString(std::vector<std::string> commands)
+bool MANTA::runPythonString(std::vector<std::string> commands)
 {
+  int success = -1;
   PyGILState_STATE gilstate = PyGILState_Ensure();
   for (std::vector<std::string>::iterator it = commands.begin(); it != commands.end(); ++it) {
     std::string command = *it;
@@ -546,19 +550,23 @@ void MANTA::runPythonString(std::vector<std::string> commands)
     memcpy(buffer, command.data(), cmdLength);
 
     buffer[cmdLength] = '\0';
-    PyRun_SimpleString(buffer);
+    success = PyRun_SimpleString(buffer);
     delete[] buffer;
 #else
-    PyRun_SimpleString(command.c_str());
+    success = PyRun_SimpleString(command.c_str());
 #endif
   }
   PyGILState_Release(gilstate);
+
+  /* PyRun_SimpleString returns 0 on success, -1 when an error occurred. */
+  assert(success == 0);
+  return (success != -1);
 }
 
 void MANTA::initializeMantaflow()
 {
   if (with_debug)
-    std::cout << "Initializing  Mantaflow" << std::endl;
+    std::cout << "Fluid: Initializing Mantaflow framework." << std::endl;
 
   std::string filename = "manta_scene_" + std::to_string(mCurrentID) + ".py";
   std::vector<std::string> fill = std::vector<std::string>();
@@ -568,18 +576,16 @@ void MANTA::initializeMantaflow()
   PyGILState_STATE gilstate = PyGILState_Ensure();
   Pb::setup(filename, fill);  // Namespace from Mantaflow (registry)
   PyGILState_Release(gilstate);
-  mantaInitialized = true;
 }
 
 void MANTA::terminateMantaflow()
 {
   if (with_debug)
-    std::cout << "Terminating Mantaflow" << std::endl;
+    std::cout << "Fluid: Releasing Mantaflow framework." << std::endl;
 
   PyGILState_STATE gilstate = PyGILState_Ensure();
   Pb::finalize();  // Namespace from Mantaflow (registry)
   PyGILState_Release(gilstate);
-  mantaInitialized = false;
 }
 
 static std::string getCacheFileEnding(char cache_format)
@@ -599,8 +605,8 @@ static std::string getCacheFileEnding(char cache_format)
     case FLUID_DOMAIN_FILE_OBJECT:
       return ".obj";
     default:
-      if (MANTA::with_debug)
-        std::cout << "Error: Could not find file extension" << std::endl;
+      std::cerr << "Fluid Error -- Could not find file extension. Using default file extension."
+                << std::endl;
       return ".uni";
   }
 }
@@ -618,8 +624,7 @@ std::string MANTA::getRealValue(const std::string &varName, FluidModifierData *m
   }
 
   if (!mmd) {
-    if (with_debug)
-      std::cout << "Invalid modifier data in getRealValue()" << std::endl;
+    std::cerr << "Fluid Error -- Invalid modifier data." << std::endl;
     ss << "ERROR - INVALID MODIFIER DATA";
     return ss.str();
   }
@@ -994,7 +999,7 @@ std::string MANTA::getRealValue(const std::string &varName, FluidModifierData *m
   else if (varName == "USING_DIFFUSION")
     ss << (mmd->domain->flags & FLUID_DOMAIN_USE_DIFFUSION ? "True" : "False");
   else
-    std::cout << "ERROR: Unknown option: " << varName << std::endl;
+    std::cerr << "Fluid Error -- Unknown option: " << varName << std::endl;
   return ss.str();
 }
 
@@ -1034,24 +1039,27 @@ std::string MANTA::parseScript(const std::string &setup_string, FluidModifierDat
   return res.str();
 }
 
-int MANTA::updateFlipStructures(FluidModifierData *mmd, int framenr)
+bool MANTA::updateFlipStructures(FluidModifierData *mmd, int framenr)
 {
   if (MANTA::with_debug)
     std::cout << "MANTA::updateFlipStructures()" << std::endl;
 
   mFlipFromFile = false;
 
+  if (!mUsingLiquid)
+    return false;
+  if (BLI_path_is_rel(mmd->domain->cache_directory))
+    return false;
+
+  int result = 0;
+  int expected = 0; /* Expected number of read successes for this frame. */
+
   // Ensure empty data structures at start
   if (mFlipParticleData)
     mFlipParticleData->clear();
   if (mFlipParticleVelocity)
     mFlipParticleVelocity->clear();
 
-  if (!mUsingLiquid)
-    return 0;
-  if (BLI_path_is_rel(mmd->domain->cache_directory))
-    return 0;
-
   std::ostringstream ss;
   char cacheDir[FILE_MAX], targetFile[FILE_MAX];
   cacheDir[0] = '\0';
@@ -1061,27 +1069,31 @@ int MANTA::updateFlipStructures(FluidModifierData *mmd, int framenr)
   BLI_path_join(
       cacheDir, sizeof(cacheDir), mmd->domain->cache_directory, FLUID_DOMAIN_DIR_DATA, nullptr);
 
+  expected += 1;
+  ss.str("");
   ss << "pp_####" << pformat;
   BLI_join_dirfile(targetFile, sizeof(targetFile), cacheDir, ss.str().c_str());
   BLI_path_frame(targetFile, framenr, 0);
-
   if (BLI_exists(targetFile)) {
-    updateParticlesFromFile(targetFile, false, false);
+    result += updateParticlesFromFile(targetFile, false, false);
+    assert(result == expected);
   }
 
+  expected += 1;
   ss.str("");
   ss << "pVel_####" << pformat;
   BLI_join_dirfile(targetFile, sizeof(targetFile), cacheDir, ss.str().c_str());
   BLI_path_frame(targetFile, framenr, 0);
-
   if (BLI_exists(targetFile)) {
-    updateParticlesFromFile(targetFile, false, true);
+    result += updateParticlesFromFile(targetFile, false, true);
+    assert(result == expected);
   }
+
   mFlipFromFile = true;
-  return 1;
+  return (result == expected);
 }
 
-int MANTA::updateMeshStructures(FluidModifierData *mmd, int framenr)
+bool MANTA::updateMeshStructures(FluidModifierData *mmd, int framenr)
 {
   if (MANTA::with_debug)
     std::cout << "MANTA::updateMeshStructures()" << std::endl;
@@ -1089,9 +1101,12 @@ int MANTA::updateMeshStructures(FluidModifierData *mmd, int framenr)
   mMeshFromFile = false;
 
   if (!mUsingMesh)
-    return 0;
+    return false;
   if (BLI_path_is_rel(mmd->domain->cache_directory))
-    return 0;
+    return false;
+
+  int result = 0;
+  int expected = 0; /* Expected number of read successes for this frame. */
 
   // Ensure empty data structures at start
   if (mMeshNodes)
@@ -1111,29 +1126,33 @@ int MANTA::updateMeshStructures(FluidModifierData *mmd, int framenr)
   BLI_path_join(
       cacheDir, sizeof(cacheDir), mmd->domain->cache_directory, FLUID_DOMAIN_DIR_MESH, nullptr);
 
+  expected += 1;
+  ss.str("");
   ss << "lMesh_####" << mformat;
   BLI_join_dirfile(targetFile, sizeof(targetFile), cacheDir, ss.str().c_str());
   BLI_path_frame(targetFile, framenr, 0);
-
   if (BLI_exists(targetFile)) {
-    updateMeshFromFile(targetFile);
+    result += updateMeshFromFile(targetFile);
+    assert(result == expected);
   }
 
   if (mUsingMVel) {
+    expected += 1;
     ss.str("");
     ss << "lVelMesh_####" << dformat;
     BLI_join_dirfile(targetFile, sizeof(targetFile), cacheDir, ss.str().c_str());
     BLI_path_frame(targetFile, framenr, 0);
-
     if (BLI_exists(targetFile)) {
-      updateMeshFromFile(targetFile);
+      result += updateMeshFromFile(targetFile);
+      assert(result == expected);
     }
   }
+
   mMeshFromFile = true;
-  return 1;
+  return (result == expected);
 }
 
-int MANTA::updateParticleStructures(FluidModifierData *mmd, int framenr)
+bool MANTA::updateParticleStructures(FluidModifierData *mmd, int framenr)
 {
   if (MANTA::with_debug)
     std::cout << "MANTA::updateParticleStructures()" << std::endl;
@@ -1141,9 +1160,12 @@ int MANTA::updateParticleStructures(FluidModifierData *mmd, int framenr)
   mParticlesFromFile = false;
 
   if (!mUsingDrops && !mUsingBubbles && !mUsingFloats && !mUsingTracers)
-    return 0;
+    return false;
   if (BLI_path_is_rel(mmd->domain->cache_directory))
-    return 0;
+    return false;
+
+  int result = 0;
+  int expected = 0; /* Expected number of read successes for this frame. */
 
   // Ensure empty data structures at start
   if (mSndParticleData)
@@ -1165,36 +1187,41 @@ int MANTA::updateParticleStructures(FluidModifierData *mmd, int framenr)
                 FLUID_DOMAIN_DIR_PARTICLES,
                 nullptr);
 
+  expected += 1;
+  ss.str("");
   ss << "ppSnd_####" << pformat;
   BLI_join_dirfile(targetFile, sizeof(targetFile), cacheDir, ss.str().c_str());
   BLI_path_frame(targetFile, framenr, 0);
-
   if (BLI_exists(targetFile)) {
-    updateParticlesFromFile(targetFile, true, false);
+    result += updateParticlesFromFile(targetFile, true, false);
+    assert(result == expected);
   }
 
+  expected += 1;
   ss.str("");
   ss << "pVelSnd_####" << pformat;
   BLI_join_dirfile(targetFile, sizeof(targetFile), cacheDir, ss.str().c_str());
   BLI_path_frame(targetFile, framenr, 0);
-
   if (BLI_exists(targetFile)) {
-    updateParticlesFromFile(targetFile, true, true);
+    result += updateParticlesFromFile(targetFile, true, true);
+    assert(result == expected);
   }
 
+  expected += 1;
   ss.str("");
   ss << "pLifeSnd_####" << pformat;
   BLI_join_dirfile(targetFile, sizeof(targetFile), cacheDir, ss.str().c_str());
   BLI_path_frame(targetFile, framenr, 0);
-
   if (BLI_exists(targetFile)) {
-    updateParticlesFromFile(targetFile, true, false);
+    result += updateParticlesFromFile(targetFile, true, false);
+    assert(result == expected);
   }
+
   mParticlesFromFile = true;
-  return 1;
+  return (result == expected);
 }
 
-int MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
+bool MANTA::updateSmokeStructures(FluidModifierData *mmd, int framenr)
 {
   if (MANTA::with_debug)
     std::cout << "MANTA::updateGridStructures()" << std::endl;
@@ -1202,9 +1229,9 @@ int MANTA::updateSmokeStructures(FluidModifierData *

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list