From 3230448de9087f4d0bdcd8e3e04580bf72621cc7 Mon Sep 17 00:00:00 2001 From: Yoann Audouin Date: Wed, 31 May 2023 11:35:57 +0200 Subject: [PATCH] Correction for random error with NETGEN when multiple computation run at the same time Netgen is creating a few files while running in the current folder. Added code to have netgen change current directory when running. --- src/NETGENPlugin/NETGENPlugin_Mesher.cxx | 4 +++- src/NETGENPlugin/NETGENPlugin_Mesher.hxx | 30 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx index cd3f97d..16c9f08 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx @@ -504,6 +504,8 @@ namespace } // namespace + + //============================================================================= /*! * @@ -4440,7 +4442,7 @@ int& NETGENPlugin_NetgenLibWrapper::instanceCounter() //================================================================================ NETGENPlugin_NetgenLibWrapper::NETGENPlugin_NetgenLibWrapper(): - _ngMesh(0) + _ngMesh(0),_tmpDir(SALOMEDS_Tool::GetTmpDir()) { if ( instanceCounter() == 0 ) { diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx index 0a3f514..4de1ec9 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx @@ -35,6 +35,7 @@ #include #include #include +#include #include @@ -59,6 +60,32 @@ namespace netgen { class OCCGeometry; class Mesh; } + +// Class for temporary folder switching +class ChdirRAII +{ + public: +#ifndef WIN32 + ChdirRAII(const std::string& wd):_wd(wd) { if(_wd.empty()) return ; char *pwd(get_current_dir_name()); _od = pwd; free(pwd); chdir(_wd.c_str()); } + ~ChdirRAII() { if(_od.empty()) return ; chdir(_od.c_str()); } +#else + ChdirRAII(const std::string& wd) : _wd(wd) { + if (_wd.empty()) + return; + TCHAR pwd[MAX_PATH]; + GetCurrentDirectory(sizeof(pwd), pwd); + _od = Kernel_Utils::utf8_encode_s(pwd); + SetCurrentDirectory(Kernel_Utils::utf8_decode_s(_wd).c_str()); + } + ~ChdirRAII() { + if (_od.empty()) return; + SetCurrentDirectory(Kernel_Utils::utf8_decode_s(_od).c_str()); + } +#endif + private: + std::string _wd; + std::string _od; +}; //============================================================================= /*! * \brief Struct storing nb of entities in netgen mesh @@ -111,6 +138,9 @@ struct NETGENPLUGIN_EXPORT NETGENPlugin_NetgenLibWrapper std::string getOutputFileName(); void removeOutputFile(); std::string _outputFileName; + // This will change current directory when the class is instanciated and switch + ChdirRAII _tmpDir; + ostream * _ngcout; ostream * _ngcerr; -- 2.30.2