From 2cc8b7dada11c95286e5d5504cd20454123ef0dd Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 18 Mar 2011 10:34:35 +0000 Subject: [PATCH] Cancel computation for ghs3d --- src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx | 73 +++++++++++++++++++++++++++ src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx | 10 ++++ 2 files changed, 83 insertions(+) diff --git a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx index 74f3186..abf3db6 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx +++ b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx @@ -131,6 +131,9 @@ GHS3DPlugin_GHS3D::GHS3DPlugin_GHS3D(int hypId, int studyId, SMESH_Gen* gen) _compatibleHypothesis.push_back("GHS3D_Parameters"); _compatibleHypothesis.push_back( StdMeshers_ViscousLayers::GetHypType() ); _requireShape = false; // can work without shape +#ifdef WITH_SMESH_CANCEL_COMPUTE + _compute_canceled = false; +#endif } //============================================================================= @@ -802,6 +805,9 @@ static int findShapeID(SMESH_Mesh& mesh, static bool readResultFile(const int fileOpen, #ifdef WNT const char* fileName, +#endif +#ifdef WITH_SMESH_CANCEL_COMPUTE + GHS3DPlugin_GHS3D* theAlgo, #endif SMESH_Mesh& theMesh, TopoDS_Shape tabShape[], @@ -885,6 +891,10 @@ static bool readResultFile(const int fileOpen, MESSAGE("nbEnforcedVertices: "<computeCanceled()) + return false; +#endif for (int iCoor=0; iCoor < 3; iCoor++) coord[ iCoor ] = strtod(ptr, &ptr); nodeAssigne[ iNode ] = 1; @@ -904,6 +914,10 @@ static bool readResultFile(const int fileOpen, tabID = new int[nbTriangle]; for (int i=0; i < nbTriangle; i++) { +#ifdef WITH_SMESH_CANCEL_COMPUTE + if(theAlgo->computeCanceled()) + return false; +#endif tabID[i] = 0; // find the solid corresponding to GHS3D sub-domain following // the technique proposed in GHS3D manual in chapter @@ -955,6 +969,10 @@ static bool readResultFile(const int fileOpen, // Associating the tetrahedrons to the shapes shapeID = compoundID; for (int iElem = 0; iElem < nbElems; iElem++) { +#ifdef WITH_SMESH_CANCEL_COMPUTE + if(theAlgo->computeCanceled()) + return false; +#endif for (int iNode = 0; iNode < 4; iNode++) { ID = strtol(tetraPtr, &tetraPtr, 10); itOnNode = theGhs3dIdToNodeMap.find(ID); @@ -1064,6 +1082,9 @@ static bool readResultFile(const int fileOpen, static bool readResultFile(const int fileOpen, #ifdef WNT const char* fileName, +#endif +#ifdef WITH_SMESH_CANCEL_COMPUTE + GHS3DPlugin_GHS3D* theAlgo, #endif SMESH_Mesh& theMesh, TopoDS_Shape aSolid, @@ -1137,6 +1158,10 @@ static bool readResultFile(const int fileOpen, // Reading the nodeCoord and update the nodeMap shapeID = theMeshDS->ShapeToIndex( aSolid ); for (int iNode=0; iNode < nbNodes; iNode++) { +#ifdef WITH_SMESH_CANCEL_COMPUTE + if(theAlgo->computeCanceled()) + return false; +#endif for (int iCoor=0; iCoor < 3; iCoor++) coord[ iCoor ] = strtod(ptr, &ptr); if ((iNode+1) > (nbInputNodes-nbEnforcedVertices)) { @@ -1167,6 +1192,10 @@ static bool readResultFile(const int fileOpen, // Associating the tetrahedrons to the shapes for (int iElem = 0; iElem < nbElems; iElem++) { +#ifdef WITH_SMESH_CANCEL_COMPUTE + if(theAlgo->computeCanceled()) + return false; +#endif for (int iNode = 0; iNode < 4; iNode++) { ID = strtol(tetraPtr, &tetraPtr, 10); node[ iNode ] = theNodeByGhs3dId[ ID-1 ]; @@ -1364,6 +1393,10 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, std::cout << "Ghs3d execution..." << std::endl; std::cout << cmd << std::endl; +#ifdef WITH_SMESH_CANCEL_COMPUTE + _compute_canceled = false; +#endif + system( cmd.ToCString() ); // run std::cout << std::endl; @@ -1389,6 +1422,9 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, Ok = readResultFile( fileOpen, #ifdef WNT aResultFileName.ToCString(), +#endif +#ifdef WITH_SMESH_CANCEL_COMPUTE + this, #endif theMesh, tabShape, tabBox, _nbShape, aGhs3dIdToNodeMap, toMeshHoles, nbEnforcedVertices ); @@ -1418,6 +1454,11 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, } if ( !_keepFiles ) { +#ifdef WITH_SMESH_CANCEL_COMPUTE + if (! Ok) + if(_compute_canceled) + removeFile( aLogFileName ); +#endif removeFile( aFacesFileName ); removeFile( aPointsFileName ); removeFile( aResultFileName ); @@ -1520,6 +1561,10 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, cmd += TCollection_AsciiString(" -f ") + aGenericName; // file to read cmd += TCollection_AsciiString(" 1>" ) + aLogFileName; // dump into file +#ifdef WITH_SMESH_CANCEL_COMPUTE + _compute_canceled = false; +#endif + system( cmd.ToCString() ); // run // -------------- @@ -1538,6 +1583,9 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, Ok = readResultFile( fileOpen, #ifdef WNT aResultFileName.ToCString(), +#endif +#ifdef WITH_SMESH_CANCEL_COMPUTE + this, #endif theMesh, theShape ,aNodeByGhs3dId, nbEnforcedVertices ); } @@ -1566,6 +1614,11 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, if ( !_keepFiles ) { +#ifdef WITH_SMESH_CANCEL_COMPUTE + if (! Ok) + if(_compute_canceled) + removeFile( aLogFileName ); +#endif removeFile( aFacesFileName ); removeFile( aPointsFileName ); removeFile( aResultFileName ); @@ -1576,6 +1629,22 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, return Ok; } +#ifdef WITH_SMESH_CANCEL_COMPUTE +void GHS3DPlugin_GHS3D::CancelCompute() +{ + _compute_canceled = true; +#ifdef WNT +#else + TCollection_AsciiString aGenericName + = (char*) GHS3DPlugin_Hypothesis::GetFileName(_hyp).c_str(); + TCollection_AsciiString cmd = + TCollection_AsciiString("ps ux | grep ") + aGenericName; + cmd += TCollection_AsciiString(" | grep -v grep | awk '{print $2}' | xargs kill -9 > /dev/null 2>&1"); + system( cmd.ToCString() ); +#endif +} +#endif + //================================================================================ /*! * \brief Provide human readable text by error code reported by ghs3d @@ -1761,6 +1830,10 @@ static char* getIds( char* ptr, int nbIds, vector& ids ) bool GHS3DPlugin_GHS3D::storeErrorDescription(const TCollection_AsciiString& logFile, const _Ghs2smdsConvertor & toSmdsConvertor ) { +#ifdef WITH_SMESH_CANCEL_COMPUTE + if(_compute_canceled) + return error(SMESH_Comment("interruption initiated by user")); +#endif // open file #ifdef WNT int file = ::_open (logFile.ToCString(), _O_RDONLY|_O_BINARY); diff --git a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx index 2054a79..1c2c320 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx +++ b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx @@ -51,6 +51,11 @@ public: virtual bool Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape); +#ifdef WITH_SMESH_CANCEL_COMPUTE + virtual void CancelCompute(); + bool computeCanceled() { return _compute_canceled;}; +#endif + virtual bool Evaluate(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape, MapShapeNbElems& aResMap); @@ -67,6 +72,11 @@ private: bool _keepFiles; const GHS3DPlugin_Hypothesis* _hyp; const StdMeshers_ViscousLayers* _viscousLayersHyp; + +#ifdef WITH_SMESH_CANCEL_COMPUTE + volatile bool _compute_canceled; +#endif + }; /*! -- 2.39.2