X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Gen.cxx;h=48fc0da2f3b82d0872514fe1b43e612ad418d3b1;hb=be238b4bb0723b0dd34dd72f410dc58df1e43414;hp=2a7e23af9cc1f9ab51a698f5bcae72fec78a0582;hpb=b60e215be81a131a861b11b5d778c5cd47b21459;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index 2a7e23af9..48fc0da2f 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -25,9 +25,8 @@ // Author : Paul RASCLE, EDF // Module : SMESH // - //#define CHRONODEF - +// #include "SMESH_Gen.hxx" #include "SMESH_DriverMesh.hxx" @@ -37,6 +36,8 @@ #include "SMESHDS_Document.hxx" #include "SMESH_HypoFilter.hxx" #include "SMESH_Mesh.hxx" +#include "SMESH_SequentialMesh.hxx" +#include "SMESH_ParallelMesh.hxx" #include "SMESH_MesherHelper.hxx" #include "SMESH_subMesh.hxx" @@ -50,16 +51,24 @@ #include "memoire.h" #include +#include +#include + #ifdef WIN32 #include #endif #include +#ifndef WIN32 +#include +#endif + using namespace std; +#ifndef WIN32 #include -#include namespace fs = boost::filesystem; +#endif // Environment variable separator #ifdef WIN32 @@ -151,7 +160,8 @@ SMESH_Mesh* SMESH_Gen::CreateMesh(bool theIsEmbeddedMode) Unexpect aCatch(SalomeException); // create a new SMESH_mesh object - SMESH_Mesh *aMesh = new SMESH_Mesh(_localId++, + SMESH_Mesh *aMesh = new SMESH_SequentialMesh( + _localId++, this, theIsEmbeddedMode, _studyContext->myDocument); @@ -160,6 +170,27 @@ SMESH_Mesh* SMESH_Gen::CreateMesh(bool theIsEmbeddedMode) return aMesh; } +//============================================================================= +/*! + * Creates a parallel mesh in a study. + * if (theIsEmbeddedMode) { mesh modification commands are not logged } + */ +//============================================================================= + +SMESH_ParallelMesh* SMESH_Gen::CreateParallelMesh(bool theIsEmbeddedMode) +{ + Unexpect aCatch(SalomeException); + + // create a new SMESH_mesh object + SMESH_ParallelMesh *aMesh = new SMESH_ParallelMesh( + _localId++, + this, + theIsEmbeddedMode, + _studyContext->myDocument); + _studyContext->mapMesh[_localId-1] = aMesh; + + return aMesh; +} //============================================================================= /*! @@ -178,7 +209,7 @@ bool SMESH_Gen::sequentialComputeSubMeshes( const bool complexShapeFirst, const bool aShapeOnly) { - MESSAGE("Compute submeshes sequentialy"); + MESSAGE("Sequential Compute of submeshes"); bool ret = true; @@ -197,7 +228,7 @@ bool SMESH_Gen::sequentialComputeSubMeshes( continue; // check for preview dimension limitations - if ( aShapesId && GetShapeDim( shapeType ) > (int)aDim ) + if ( aShapesId && SMESH_Gen::GetShapeDim( shapeType ) > (int)aDim ) { // clear compute state not to show previous compute errors // if preview invoked less dimension less than previous @@ -240,7 +271,7 @@ const std::function - compute_function([&] (SMESH_subMesh* sm, + compute_function([] (SMESH_subMesh* sm, SMESH_subMesh::compute_event event, SMESH_subMesh *shapeSM, bool aShapeOnly, @@ -261,6 +292,69 @@ const std::function(aMesh); + // Calling run_mesher + // Path to mesher script + fs::path send_files = fs::path(std::getenv("SMESH_ROOT_DIR"))/ + fs::path("bin")/ + fs::path("salome")/ + fs::path("send_files.py"); + + std::string s_program="python3"; + std::list params; + params.push_back(send_files.string()); + params.push_back(file_name); + params.push_back("--resource="+aParMesh.GetResource()); + + // log file + fs::path log_file=aParMesh.GetTmpFolder() / fs::path("copy.log"); + QString out_file = log_file.string().c_str(); + + // Building arguments for QProcess + QString program = QString::fromStdString(s_program); + QStringList arguments; + for(auto arg : params){ + arguments << arg.c_str(); + } + + std::string cmd = ""; + cmd += s_program; + for(auto arg: params){ + cmd += " " + arg; + } + MESSAGE("Send files command: "); + MESSAGE(cmd); + + QProcess myProcess; + myProcess.setProcessChannelMode(QProcess::MergedChannels); + myProcess.setStandardOutputFile(out_file); + + myProcess.start(program, arguments); + // Waiting for process to finish (argument -1 make it wait until the end of + // the process otherwise it just waits 30 seconds) + bool finished = myProcess.waitForFinished(-1); + int ret = myProcess.exitCode(); + + if(ret != 0 || !finished){ + // Run crahed + std::string msg = "Issue with send_files: \n"; + msg += "See log for more details: " + log_file.string() + "\n"; + msg += cmd + "\n"; + throw SALOME_Exception(msg); + } +#endif +} + //============================================================================= /*! * Algo to run the computation of all the submeshes of a mesh in parallel @@ -278,19 +372,18 @@ bool SMESH_Gen::parallelComputeSubMeshes( const bool complexShapeFirst, const bool aShapeOnly) { +#ifdef WIN32 + throw SALOME_Exception("ParallelMesh is not working on Windows"); +#else bool ret = true; SMESH_subMeshIteratorPtr smIt; SMESH_subMesh *shapeSM = aMesh.GetSubMesh(aShape); - - // Pool of thread for computation - // TODO: move when parallelMesh created - aMesh.InitPoolThreads(); + SMESH_ParallelMesh &aParMesh = dynamic_cast(aMesh); TopAbs_ShapeEnum previousShapeType = TopAbs_VERTEX; - int nbThreads = aMesh.GetNbThreads(); - MESSAGE("Compute submeshes with threads: " << nbThreads); + MESSAGE("Parallel Compute of submeshes"); smIt = shapeSM->getDependsOnIterator(includeSelf, !complexShapeFirst); @@ -304,11 +397,6 @@ bool SMESH_Gen::parallelComputeSubMeshes( // Not doing in parallel 1D and 2D meshes if ( !aMesh.HasShapeToMesh() && shapeType == TopAbs_VERTEX ) continue; - if(shapeType==TopAbs_FACE||shapeType==TopAbs_EDGE) - aMesh.SetNbThreads(0); - else - aMesh.SetNbThreads(nbThreads); - if (shapeType != previousShapeType) { // Waiting for all threads for the previous type to end @@ -319,12 +407,12 @@ bool SMESH_Gen::parallelComputeSubMeshes( case TopAbs_FACE: file_name = "Mesh2D.med"; break; - case TopAbs_EDGE: - file_name = "Mesh1D.med"; - break; - case TopAbs_VERTEX: - file_name = "Mesh0D.med"; - break; + //case TopAbs_EDGE: + // file_name = "Mesh1D.med"; + // break; + //case TopAbs_VERTEX: + // file_name = "Mesh0D.med"; + // break; case TopAbs_SOLID: default: file_name = ""; @@ -332,25 +420,34 @@ bool SMESH_Gen::parallelComputeSubMeshes( } if(file_name != "") { - fs::path mesh_file = fs::path(aMesh.tmp_folder) / fs::path(file_name); - exportMesh(mesh_file.string(), aMesh, "MESH"); - + fs::path mesh_file = fs::path(aParMesh.GetTmpFolder()) / fs::path(file_name); + SMESH_DriverMesh::exportMesh(mesh_file.string(), aMesh, "MESH"); + if (aParMesh.GetParallelismMethod() == ParallelismMethod::MultiNode) { + this->send_mesh(aMesh, mesh_file.string()); + } } //Resetting threaded pool info previousShapeType = shapeType; } // check for preview dimension limitations - if ( aShapesId && GetShapeDim( shapeType ) > (int)aDim ) + if ( aShapesId && SMESH_Gen::GetShapeDim( shapeType ) > (int)aDim ) { // clear compute state not to show previous compute errors // if preview invoked less dimension less than previous smToCompute->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); continue; } - boost::asio::post(*(aMesh._pool), std::bind(compute_function, smToCompute, computeEvent, + // Parallelism is only for 3D parts + if(shapeType!=TopAbs_SOLID){ + compute_function(smToCompute, computeEvent, shapeSM, aShapeOnly, allowedSubShapes, - aShapesId)); + aShapesId); + }else{ + boost::asio::post(*(aParMesh.GetPool()), std::bind(compute_function, smToCompute, computeEvent, + shapeSM, aShapeOnly, allowedSubShapes, + aShapesId)); + } } // Waiting for the thread for Solids to finish @@ -358,10 +455,13 @@ bool SMESH_Gen::parallelComputeSubMeshes( aMesh.GetMeshDS()->Modified(); + // Cleanup done here as in Python the destructor is not called + aParMesh.cleanup(); + return ret; +#endif }; - //============================================================================= /* * Compute a mesh @@ -408,22 +508,14 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, // =============================================== // Mesh all the sub-shapes starting from vertices // =============================================== - if (aMesh.IsParallel()) - ret = parallelComputeSubMeshes( - aMesh, aShape, aDim, - aShapesId, allowedSubShapes, - computeEvent, - includeSelf, - complexShapeFirst, - aShapeOnly); - else - ret = sequentialComputeSubMeshes( - aMesh, aShape, aDim, - aShapesId, allowedSubShapes, - computeEvent, - includeSelf, - complexShapeFirst, - aShapeOnly); + ret = aMesh.ComputeSubMeshes( + this, + aMesh, aShape, aDim, + aShapesId, allowedSubShapes, + computeEvent, + includeSelf, + complexShapeFirst, + aShapeOnly); return ret; } @@ -629,6 +721,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, if ( aShapesId && GetShapeDim( shapeType ) > (int)aDim ) continue; sm->SetAllowedSubShapes( fillAllowed( shapeSM, aShapeOnly, allowedSubShapes )); + setCurrentSubMesh( sm ); sm->ComputeStateEngine( computeEvent );