diff --git a/extern/mantaflow/patches/fix-solver-error-cleanup.patch b/extern/mantaflow/patches/fix-solver-error-cleanup.patch new file mode 100644 index 00000000000..acb205b2872 --- /dev/null +++ b/extern/mantaflow/patches/fix-solver-error-cleanup.patch @@ -0,0 +1,62 @@ +diff --git a/extern/mantaflow/preprocessed/plugin/pressure.cpp b/extern/mantaflow/preprocessed/plugin/pressure.cpp +index 593aeb16859..75118a4402a 100644 +--- a/extern/mantaflow/preprocessed/plugin/pressure.cpp ++++ b/extern/mantaflow/preprocessed/plugin/pressure.cpp +@@ -1181,7 +1181,27 @@ void solvePressureSystem(Grid &rhs, + gcg->setMGPreconditioner(GridCgInterface::PC_MGP, pmg); + } + ++ auto cleanup = [&](){ ++ // Cleanup ++ if (gcg) ++ delete gcg; ++ if (pca0) ++ delete pca0; ++ if (pca1) ++ delete pca1; ++ if (pca2) ++ delete pca2; ++ if (pca3) ++ delete pca3; ++ ++ // PcMGDynamic: always delete multigrid solver after use ++ // PcMGStatic: keep multigrid solver for next solve ++ if (pmg && preconditioner == PcMGDynamic) ++ releaseMG(parent); ++ }; ++ + // CG solve ++ try { + for (int iter = 0; iter < maxIter; iter++) { + if (!gcg->iterate()) + iter = maxIter; +@@ -1193,23 +1213,13 @@ void solvePressureSystem(Grid &rhs, + debMsg("FluidSolver::solvePressure done. Iterations:" << gcg->getIterations() + << ", residual:" << gcg->getResNorm(), + 2); ++ } ++ catch (const Manta::Error &e) { ++ cleanup(); ++ throw e; ++ } + +- // Cleanup +- if (gcg) +- delete gcg; +- if (pca0) +- delete pca0; +- if (pca1) +- delete pca1; +- if (pca2) +- delete pca2; +- if (pca3) +- delete pca3; +- +- // PcMGDynamic: always delete multigrid solver after use +- // PcMGStatic: keep multigrid solver for next solve +- if (pmg && preconditioner == PcMGDynamic) +- releaseMG(parent); ++ cleanup(); + } + static PyObject *_W_2(PyObject *_self, PyObject *_linargs, PyObject *_kwds) + { diff --git a/extern/mantaflow/preprocessed/plugin/pressure.cpp b/extern/mantaflow/preprocessed/plugin/pressure.cpp index 593aeb16859..75118a4402a 100644 --- a/extern/mantaflow/preprocessed/plugin/pressure.cpp +++ b/extern/mantaflow/preprocessed/plugin/pressure.cpp @@ -1181,7 +1181,27 @@ void solvePressureSystem(Grid &rhs, gcg->setMGPreconditioner(GridCgInterface::PC_MGP, pmg); } + auto cleanup = [&](){ + // Cleanup + if (gcg) + delete gcg; + if (pca0) + delete pca0; + if (pca1) + delete pca1; + if (pca2) + delete pca2; + if (pca3) + delete pca3; + + // PcMGDynamic: always delete multigrid solver after use + // PcMGStatic: keep multigrid solver for next solve + if (pmg && preconditioner == PcMGDynamic) + releaseMG(parent); + }; + // CG solve + try { for (int iter = 0; iter < maxIter; iter++) { if (!gcg->iterate()) iter = maxIter; @@ -1193,23 +1213,13 @@ void solvePressureSystem(Grid &rhs, debMsg("FluidSolver::solvePressure done. Iterations:" << gcg->getIterations() << ", residual:" << gcg->getResNorm(), 2); + } + catch (const Manta::Error &e) { + cleanup(); + throw e; + } - // Cleanup - if (gcg) - delete gcg; - if (pca0) - delete pca0; - if (pca1) - delete pca1; - if (pca2) - delete pca2; - if (pca3) - delete pca3; - - // PcMGDynamic: always delete multigrid solver after use - // PcMGStatic: keep multigrid solver for next solve - if (pmg && preconditioner == PcMGDynamic) - releaseMG(parent); + cleanup(); } static PyObject *_W_2(PyObject *_self, PyObject *_linargs, PyObject *_kwds) {