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.
This commit is contained in:
Yoann Audouin 2023-05-31 11:35:57 +02:00
parent 77dd934774
commit 3230448de9
2 changed files with 33 additions and 1 deletions

View File

@ -504,6 +504,8 @@ namespace
} // namespace } // namespace
//============================================================================= //=============================================================================
/*! /*!
* *
@ -4440,7 +4442,7 @@ int& NETGENPlugin_NetgenLibWrapper::instanceCounter()
//================================================================================ //================================================================================
NETGENPlugin_NetgenLibWrapper::NETGENPlugin_NetgenLibWrapper(): NETGENPlugin_NetgenLibWrapper::NETGENPlugin_NetgenLibWrapper():
_ngMesh(0) _ngMesh(0),_tmpDir(SALOMEDS_Tool::GetTmpDir())
{ {
if ( instanceCounter() == 0 ) if ( instanceCounter() == 0 )
{ {

View File

@ -35,6 +35,7 @@
#include <SMDS_MeshElement.hxx> #include <SMDS_MeshElement.hxx>
#include <SMESH_Algo.hxx> #include <SMESH_Algo.hxx>
#include <SMESH_ProxyMesh.hxx> #include <SMESH_ProxyMesh.hxx>
#include <SALOMEDS_Tool.hxx>
#include <TopTools_IndexedMapOfShape.hxx> #include <TopTools_IndexedMapOfShape.hxx>
@ -59,6 +60,32 @@ namespace netgen {
class OCCGeometry; class OCCGeometry;
class Mesh; 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 * \brief Struct storing nb of entities in netgen mesh
@ -111,6 +138,9 @@ struct NETGENPLUGIN_EXPORT NETGENPlugin_NetgenLibWrapper
std::string getOutputFileName(); std::string getOutputFileName();
void removeOutputFile(); void removeOutputFile();
std::string _outputFileName; std::string _outputFileName;
// This will change current directory when the class is instanciated and switch
ChdirRAII _tmpDir;
ostream * _ngcout; ostream * _ngcout;
ostream * _ngcerr; ostream * _ngcerr;