X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGHS3DPRLPlugin%2FGHS3DPRLPlugin_GHS3DPRL.cxx;h=eb92f305a1ed48d3831a05c7024d524546c548b8;hb=f90fb724f90e06b4a14dfc033acfe2a9aed67e1c;hp=7b468cefe5486ac20fc0aa9ce26e3352784a0aa3;hpb=c76ddc0ae514ae0ab3780dc579817b277971c0b1;p=plugins%2Fghs3dprlplugin.git diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx old mode 100755 new mode 100644 index 7b468ce..eb92f30 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -24,69 +24,56 @@ // #include "GHS3DPRLPlugin_GHS3DPRL.hxx" #include "GHS3DPRLPlugin_Hypothesis.hxx" +#include "MG_TetraHPC_API.hxx" -#include -#include +#include +#include +#include #include - -#include -#include +#include #include "utilities.h" -#ifndef WIN32 -#include -#endif - -#ifdef _DEBUG_ -#define DUMP(txt) \ -// cout << txt -#else -#define DUMP(txt) -#endif - -#include -#include -#include - #include + +#include +#include +#include #include #include +#include #include #include -#include -#include +#include +#include -/* -extern "C" { -#include -//#include -#include -//#include -#include -} -using namespace med_2_2;*/ +#define GMFVERSION GmfDouble +#define GMFDIMENSION 3 + +using namespace std; static void removeFile( const TCollection_AsciiString& fileName ) { try { OSD_File( fileName ).Remove(); } - catch ( Standard_ProgramError ) { + catch ( Standard_ProgramError& ) { MESSAGE("Can't remove file: " << fileName.ToCString() << " ; file does not exist or permission denied"); } } //============================================================================= -GHS3DPRLPlugin_GHS3DPRL::GHS3DPRLPlugin_GHS3DPRL(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_3D_Algo(hypId, studyId, gen) +GHS3DPRLPlugin_GHS3DPRL::GHS3DPRLPlugin_GHS3DPRL(int hypId, SMESH_Gen* gen) + : SMESH_3D_Algo(hypId, gen) { MESSAGE("GHS3DPRLPlugin_GHS3DPRL::GHS3DPRLPlugin_GHS3DPRL"); _name = "MG-Tetra Parallel"; _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID);// 1 bit /shape type + _onlyUnaryInput = false; // Compute() will be called on a compound of solids _countSubMesh=0; _nodeRefNumber=0; _compatibleHypothesis.push_back(GHS3DPRLPlugin_Hypothesis::GetHypType()); + _requireShape=false; } //============================================================================= @@ -111,8 +98,8 @@ bool GHS3DPRLPlugin_GHS3DPRL::CheckHypothesis int nbHyp = hyps.size(); if (!nbHyp) { - aStatus = SMESH_Hypothesis::HYP_OK; - return true; // can work with no hypothesis + aStatus = SMESH_Hypothesis::HYP_MISSING; + return false; // can't work with no hypothesis } itl = hyps.begin(); @@ -131,286 +118,21 @@ bool GHS3DPRLPlugin_GHS3DPRL::CheckHypothesis return aStatus == SMESH_Hypothesis::HYP_OK; } -//======================================================================= -static bool writeGHS3DPRLFiles (const TCollection_AsciiString & GHS3DPRL_In, - SMESHDS_Mesh * theMesh, - map & theSmdsToGHS3DPRLIdMap, - map & theGHS3DPRLIdToNodeMap) -{ - bool Ok; - int ifam=0; - TCollection_AsciiString namefile(GHS3DPRL_In); - namefile+=".points"; - removeFile(namefile); - ofstream theFile; - theFile.open(namefile.ToCString(),ios::out); -#ifdef WIN32 - Ok = theFile.is_open(); -#else - Ok=theFile.rdbuf()->is_open(); -#endif - if (!Ok) - { - INFOS("Can't write into "<NbNodes(); - int nbFaces=theMesh->NbFaces(); //triangles or quadrangles - const char* space=" "; - const int dummyint=1; //nrs,nsd,refnum=1 (for wrap) - - // Writing SMESH points into GHS3DPRL File.points - theFile<nodesIterator(); - //int ifam=100;//test famille - theFile.precision(15); theFile.setf(ios::scientific,ios::floatfield); - //cout<<"set precision 15 on float\n"; - while (itOnNode->more()) - { - node_2 = itOnNode->next(); - theSmdsToGHS3DPRLIdMap.insert(map ::value_type(node_2->GetID(),aSmdsNodeID)); - theGHS3DPRLIdToNodeMap.insert(map ::value_type(aSmdsNodeID,node_2)); - theFile<X()<Y()<Z()<is_open(); -#endif - if (!Ok) - { - INFOS("Can't write into "<::const_iterator itOnSmdsNode; - SMDS_ElemIteratorPtr itOnFaceNode; - SMDS_FaceIteratorPtr itOnSmdsFace = theMesh->facesIterator(); - long nbNoTriangles=0; - int ifaces=0; - //ifam=300; - while (itOnSmdsFace->more()) - { - aFace=itOnSmdsFace->next(); - itOnFaceNode=aFace->nodesIterator(); - const int nbNodes=aFace->NbNodes(); - if (nbNodes!=3) nbNoTriangles++; - ifaces++; - theFile<more()) - { - aSmdsNodeID=itOnFaceNode->next()->GetID(); - itOnSmdsNode=theSmdsToGHS3DPRLIdMap.find(aSmdsNodeID); - ASSERT(itOnSmdsNode!=theSmdsToGHS3DPRLIdMap.end()); - theFile< & theGHS3DPRLIdToNodeMap, - const TCollection_AsciiString & GHS3DPRL_Out, - int & nodeRefNumber) -{ - // --------------------------------- - // Read generated elements and nodes - // --------------------------------- - - cout << "Reading GHS3DPRL output file : " << GHS3DPRL_Out << endl; - cout << endl; - - char aBuffer[ GHS3DPRLPlugin_BUFLENGTH ]; - char * aPtr; - int aLineNb = 0; - int shapeID = theMesh->ShapeToIndex( theShape ); - - int line = 1, EndOfFile = 0, nbElem = 0, nField = 10, nbRef = 0, aGHS3DPRLNodeID = 0; - const char * theField; - - vector tabField = vector(nField); - vector tabRef = vector(nField); - - tabField[0] = "MeshVersionFormatted"; tabRef[0] = 0; - tabField[1] = "Dimension"; tabRef[1] = 0; - tabField[2] = "Vertices"; tabRef[2] = 3; - tabField[3] = "Edges"; tabRef[3] = 2; - tabField[4] = "Triangles"; tabRef[4] = 3; - tabField[5] = "Quadrilaterals"; tabRef[5] = 4; - tabField[6] = "Hexahedra"; tabRef[6] = 8; - tabField[7] = "Corners"; tabRef[7] = 1; - tabField[8] = "Ridges"; tabRef[0] = 1; - tabField[9] = "End"; tabRef[0] = 0; - - nodeRefNumber += theMesh->NbNodes(); - - SMDS_NodeIteratorPtr itOnGHS3DPRLInputNode = theMesh->nodesIterator(); - while ( itOnGHS3DPRLInputNode->more() ) - theMesh->RemoveNode( itOnGHS3DPRLInputNode->next() ); - - while ( EndOfFile == 0 ) { - GHS3DPRLPlugin_ReadLine( aPtr, aBuffer, theFile, aLineNb ); - for ( int iField = 0; iField < nField; iField++ ) { - stringstream theMessage; - theField = tabField[iField]; - if ( strncmp(aPtr, theField, strlen(theField)) == 0 ) { - if ( strcmp(theField, "End") == 0 ) { - EndOfFile = 1; - theMessage << "End of GHS3DPRL output file has been reached"; - } - else { - GHS3DPRLPlugin_ReadLine( aPtr, aBuffer, theFile, aLineNb ); - line++; - getInt( nbElem, aPtr ); - - if ( strcmp(theField, "MeshVersionFormatted") == 0 ) - theMessage << "GHS3DPRL mesh descriptor : " << theField << " " << nbElem; - else if ( strcmp(theField, "Dimension") == 0 ) - theMessage << "GHS3DPRL mesh of " << nbElem << "D dimension"; - else if ( strcmp(theField, "Vertices") == 0 || - strcmp(theField, "Edges") == 0 || - strcmp(theField, "Quadrilaterals") == 0 || - strcmp(theField, "Hexahedra") == 0 ) { - nbRef = tabRef[iField]; - GHS3DPRLPlugin_ReadLine( aPtr, aBuffer, theFile, aLineNb ); // read blank line - - if ( strcmp(theField, "Vertices") == 0 ) { - int aGHS3DPRLID; - vector coord = vector(nbRef); - SMDS_MeshNode * aGHS3DPRLNode; - - for ( int iElem = 0; iElem < nbElem; iElem++ ) { - aGHS3DPRLID = iElem + 1 + nodeRefNumber; - GHS3DPRLPlugin_ReadLine( aPtr, aBuffer, theFile, aLineNb ); // read file lines - for ( int iCoord = 0; iCoord < 3; iCoord++ ) - getDouble ( coord[ iCoord ], aPtr ); - aGHS3DPRLNode = theMesh->AddNode(coord[0], coord[1], coord[2]); - theMesh->SetNodeInVolume( aGHS3DPRLNode, shapeID ); - theGHS3DPRLIdToNodeMap[ aGHS3DPRLID ] = aGHS3DPRLNode; - } - } - else { - vector node = vector(nbRef); - SMDS_MeshElement* aGHS3DPRLElement; - map ::iterator itOnGHS3DPRLNode; - - for ( int iElem = 0; iElem < nbElem; iElem++ ) { - GHS3DPRLPlugin_ReadLine( aPtr, aBuffer, theFile, aLineNb ); // read file lines - for ( int iRef = 0; iRef < nbRef; iRef++ ) { - getInt ( aGHS3DPRLNodeID, aPtr ); // read nbRef aGHS3DPRLNodeID - aGHS3DPRLNodeID += nodeRefNumber; - itOnGHS3DPRLNode = theGHS3DPRLIdToNodeMap.find( aGHS3DPRLNodeID ); - node[ iRef ] = itOnGHS3DPRLNode->second; - } - - if ( strcmp(theField, "Edges") == 0 ) // create an element - aGHS3DPRLElement = theMesh->AddEdge( node[0], node[1] ); - else if ( strcmp(theField, "Quadrilaterals") == 0 ) - aGHS3DPRLElement = theMesh->AddFace( node[0], node[1], node[2], node[3] ); - else if ( strcmp(theField, "Hexahedra") == 0 ) - aGHS3DPRLElement = theMesh->AddVolume( node[0], node[1], node[2], node[3], node[4], node[5], node[6], node[7] ); - - theMesh->SetMeshElementOnShape( aGHS3DPRLElement, shapeID ); - } - } - theMessage << nbElem << " " << theField << " created"; - } - } - if ( theMessage.str().size() != 0 ) { - cout << theMessage.str() << endl; - break; - } - } - } - } - cout << endl; - return true; -} - //============================================================================= // Pass parameters to GHS3DPRL void GHS3DPRLPlugin_GHS3DPRL::SetParameters(const GHS3DPRLPlugin_Hypothesis* hyp) { if (hyp) { MESSAGE("GHS3DPRLPlugin_GHS3DPRL::SetParameters"); - _MEDName = hyp->GetMEDName(); //"DOMAIN\0" - _NbPart = hyp->GetNbPart(); - _KeepFiles = hyp->GetKeepFiles(); - _Background = hyp->GetBackground(); - _ToMergeSubdomains = hyp->GetToMergeSubdomains(); - _ToTagSubdomains = hyp->GetToTagSubdomains(); - _ToOutputInterfaces = hyp->GetToOutputInterfaces(); - _ToDiscardSubdomains = hyp->GetToDiscardSubdomains(); + _MEDName = hyp->GetMEDName(); //"DOMAIN\0" + _NbPart = hyp->GetNbPart(); + _KeepFiles = hyp->GetKeepFiles(); + _Background = hyp->GetBackground(); + _Multithread = hyp->GetMultithread(); + _Gradation = hyp->GetGradation(); + _MinSize = hyp->GetMinSize(); + _MaxSize = hyp->GetMaxSize(); + _AdvOptions = hyp->GetAdvancedOption(); } } @@ -443,381 +165,263 @@ static TCollection_AsciiString getTmpDir() } //============================================================================= -// Here we are going to use the GHS3DPRL mesher for tetra-hpc (formerly tepal in v3 (2014)) -bool GHS3DPRLPlugin_GHS3DPRL::Compute(SMESH_Mesh& theMesh, - const TopoDS_Shape& theShape) +// Write a skin mesh into a GMF file or pass it to MG-TetraHPC API +static void exportGMF(MG_TetraHPC_API* theTetraInput, + const char* theFile, + const SMESHDS_Mesh* theMeshDS) { - bool Ok=false; - TCollection_AsciiString pluginerror("ghs3dprl: "); - SMESHDS_Mesh* meshDS = theMesh.GetMeshDS(); - //cout<<"GetMeshDS done\n"; - if (_countSubMesh==0){ - MESSAGE("GHS3DPRLPlugin_GHS3DPRL::Compute for tetra-hpc"); - _countTotal=0; - TopExp_Explorer expf(meshDS->ShapeToMesh(), TopAbs_SOLID); - for ( ; expf.More(); expf.Next() ) _countTotal++; - } - _countSubMesh++; - //cout<<"Compute _countSubMesh "<<_countSubMesh<0) { - path=casenamemed.SubString(1,n); - casenamemed=casenamemed.SubString(n+1,casenamemed.Length()); - } - else - path=tmpDir; - - if (casenamemed.Length()>20){ - casenamemed=casenamemed.SubString(1,20); - cerr<<"MEDName truncated (no more 20 characters) = "< avoid warning message - //med_idt fid=MEDouvrir((const char *)fileskinmed.ToCString(),MED_CREATION); - //med_err ret=MEDfermer(fid); - //fileskinmed=fileskinmed + "cp /home/wambeke/empty.med "+ path + "GHS3DPRL_skin.med"; - //system( fileskinmed.ToCString() ); - fileskinmed=path + "GHS3DPRL_skin.med"; - cout<<"Write file "<GmfOpenMesh( theFile, GmfWrite, GMFVERSION, GMFDIMENSION); + + // nodes + int iN = 0, nbNodes = theMeshDS->NbNodes(); + theTetraInput->GmfSetKwd( meshID, GmfVertices, nbNodes ); + std::map< const SMDS_MeshNode*, int, TIDCompare > node2IdMap; + SMDS_NodeIteratorPtr nodeIt = theMeshDS->nodesIterator(); + SMESH_TNodeXYZ n; + while ( nodeIt->more() ) + { + n.Set( nodeIt->next() ); + theTetraInput->GmfSetLin( meshID, GmfVertices, n.X(), n.Y(), n.Z(), n._node->getshapeId() ); + node2IdMap.insert( node2IdMap.end(), std::make_pair( n._node, ++iN )); + } -//============================================================================= -// Here we are going to use the GHS3DPRL mesher (old obsolescent version tepal in v1 & v2 (before 2014)) -bool GHS3DPRLPlugin_GHS3DPRL::ComputeForTepal(SMESH_Mesh& theMesh, - const TopoDS_Shape& theShape) -{ - bool Ok; - TCollection_AsciiString pluginerror("ghs3dprl: "); - SMESHDS_Mesh* meshDS = theMesh.GetMeshDS(); - //cout<<"GetMeshDS done\n"; - if (_countSubMesh==0){ - MESSAGE("GHS3DPRLPlugin_GHS3DPRL::Compute"); - _countTotal=0; - TopExp_Explorer expf(meshDS->ShapeToMesh(), TopAbs_SOLID); - for ( ; expf.More(); expf.Next() ) _countTotal++; - } - _countSubMesh++; - //cout<<"Compute _countSubMesh "<<_countSubMesh<0) { - path=casenamemed.SubString(1,n); - casenamemed=casenamemed.SubString(n+1,casenamemed.Length()); - } - else - path=tmpDir; - - if (casenamemed.Length()>20){ - casenamemed=casenamemed.SubString(1,20); - cerr<<"MEDName truncated (no more 20 characters) = "< avoid warning message - //med_idt fid=MEDouvrir((const char *)fileskinmed.ToCString(),MED_CREATION); - //med_err ret=MEDfermer(fid); - //fileskinmed=fileskinmed + "cp /home/wambeke/empty.med "+ path + "GHS3DPRL_skin.med"; - //system( fileskinmed.ToCString() ); - fileskinmed=path + "GHS3DPRL_skin.med"; - cout<<"Write file "< 0) { - //Processus pere - cout<<"le pere est la\n"; - system("echo le pere > lepere.tmp"); - system("sleep 10"); - system("ps -edf |grep wambeke > pslepere.tmp"); - cout<<"le pere return 0\n"; - return 0; //ok - //exit(0); - } else if (pid == 0) { - //Processus fils - cout<<"le fils est la\n"; - //On rend le fils independant de tout terminal - setsid(); - system("sleep 20"); - system("echo le fils > lefils.tmp"); - system("sleep 20"); - system("ps -edf |grep wambeke > pslefils.tmp"); - cout<<"le fils return 0\n"; - return 0; //ok - } else { - //Traitement d'erreur - cout<<"ya probleme sur fork()\n"; - return 1; //ko - }*/ + // triangles + SMDS_ElemIteratorPtr elemIt = theMeshDS->elementGeomIterator( SMDSGeom_TRIANGLE ); + if ( elemIt->more() ) + { + int nbTria = theMeshDS->GetMeshInfo().NbElements( SMDSGeom_TRIANGLE ); + theTetraInput->GmfSetKwd(meshID, GmfTriangles, nbTria ); + for ( int gmfID = 1; elemIt->more(); ++gmfID ) + { + const SMDS_MeshElement* tria = elemIt->next(); + theTetraInput->GmfSetLin(meshID, GmfTriangles, + node2IdMap[ tria->GetNode( 0 )], + node2IdMap[ tria->GetNode( 1 )], + node2IdMap[ tria->GetNode( 2 )], + tria->getshapeId() ); + } + } + theTetraInput->GmfCloseMesh( meshID ); } //============================================================================= -ostream & GHS3DPRLPlugin_GHS3DPRL::SaveTo(ostream & save) +// Here we are going to use the GHS3DPRL mesher for tetra-hpc (formerly tepal in v3 (2014)) +bool GHS3DPRLPlugin_GHS3DPRL::Compute(SMESH_Mesh& theMesh, + const TopoDS_Shape& /*theShape*/) { - return save; + SMESH_MesherHelper helper( theMesh ); + bool ok = Compute( theMesh, &helper ); + return ok; } //============================================================================= -istream & GHS3DPRLPlugin_GHS3DPRL::LoadFrom(istream & load) +// Here we are going to use the GHS3DPRL mesher for tetra-hpc (formerly tepal in v3 (2014)) +bool GHS3DPRLPlugin_GHS3DPRL::Compute(SMESH_Mesh& theMesh, + SMESH_MesherHelper* /*theHelper*/) { - return load; -} + bool Ok=false; + TCollection_AsciiString pluginerror("ghs3dprl: "); + SMESHDS_Mesh* meshDS = theMesh.GetMeshDS(); + if ( theMesh.NbTriangles() == 0 ) + return error( COMPERR_BAD_INPUT_MESH, "No triangles in the mesh" ); + + if (_hypothesis==NULL){ + pluginerror += "No existing parameters/hypothesis for GHS3DPRL"; + cout <<"\n"<0) { + path=casenamemed.SubString(1,n); + casenamemed=casenamemed.SubString(n+1,casenamemed.Length()); + } + else + path=tmpDir; -//============================================================================= -ostream & operator << (ostream & save, GHS3DPRLPlugin_GHS3DPRL & hyp) -{ - return hyp.SaveTo( save ); -} + if (casenamemed.Length()>20){ + casenamemed=casenamemed.SubString(1,20); + cerr<<"MEDName truncated (no more 20 characters) = "<> (istream & load, GHS3DPRLPlugin_GHS3DPRL & hyp) -{ - return hyp.LoadFrom( load ); + map aSmdsToGHS3DPRLIdMap; + map aGHS3DPRLIdToNodeMap; + GHS3DPRL_In = path + "GHS3DPRL"; + GHS3DPRL_Out = path + casenamemed; + GHS3DPRL_Out_Mesh = path + casenamemed + "_out.mesh"; + GHS3DPRL_Outxml = path + casenamemed + ".xml"; //master file + logFileName = path + casenamemed + ".log"; // MG library output + NbPart=_NbPart; + Gradation=_Gradation; + MinSize=_MinSize; + MaxSize=_MaxSize; + + //an example: + //tetrahpc2med --casename=/home/whoami/tmp/GHS3DPRL --number=5 --medname=DOMAIN + // --gradation=1.05 --min_size=1e-3 --max_size=1e-2 + // --verbose=0 --menu=no --launchtetra=yes; + + run_GHS3DPRL = run_GHS3DPRL + + " --casename=" + GHS3DPRL_In + + " --number=" + NbPart + + " --medname=" + GHS3DPRL_Out + + " --launchtetra=yes" + + " --gradation=" + Gradation + + " --min_size=" + MinSize + + " --max_size=" + MaxSize + + " --verbose=3" + + " " + _AdvOptions.c_str(); + if (_Background) run_GHS3DPRL += " --background=yes"; else run_GHS3DPRL += " --background=no"; + if (_Multithread) run_GHS3DPRL += " --multithread=yes"; else run_GHS3DPRL += " --multithread=no"; + run_nokeep_files = rm +GHS3DPRL_In + "* " + path + "tetrahpc.log"; + system( run_nokeep_files.ToCString() ); //clean files + run_nokeep_files = rm + GHS3DPRL_In + "* "; + + fileskinmesh=path + "GHS3DPRL.mesh"; + GHS3DPRL_Out = path + casenamemed; + removeFile( GHS3DPRL_Outxml ); //only the master xml file + + MG_TetraHPC_API mgTetraHPC( _computeCanceled, _progress ); + bool useLib = ( mgTetraHPC.IsLibrary() && !_Background && _Multithread ); + if ( !useLib ) + mgTetraHPC.SetUseExecutable(); + + exportGMF( &mgTetraHPC, fileskinmesh.ToCString(), meshDS ); + + if ( true /*useLib*/ ) + { + TCollection_AsciiString cmd = TCollection_AsciiString("mg-tetra_hpc.exe") + + " --number_of_subdomains=" + NbPart + + " --gradation=" + Gradation + + " --min_size=" + MinSize + + " --max_size=" + MaxSize + + " --verbose=3" + + " --out=" + GHS3DPRL_Out_Mesh + + " " + _AdvOptions.c_str(); + + cout << endl + << " Run mg-tetra_hpc as library. Creating a mesh file " << GHS3DPRL_Out_Mesh << endl + << " Creating a log file : " << logFileName << endl << endl; + mgTetraHPC.SetLogFile( logFileName.ToCString() ); + + std::string log; + mgTetraHPC.Compute( cmd.ToCString(), log ); + + if ( log.empty() ) + log = mgTetraHPC.GetLog(); + if ( log.find(" Dlim " ) != std::string::npos || + log.find(" license ") != std::string::npos ) + return error("License problem"); + + // set --launchtetra=no + int yesPos = run_GHS3DPRL.Search("launchtetra") + sizeof("launchtetra"); + run_GHS3DPRL.SetValue( yesPos+0, 'n' ); + run_GHS3DPRL.SetValue( yesPos+1, 'o' ); + run_GHS3DPRL.SetValue( yesPos+2, ' ' ); + } + else + { + cout<<" Write input file for mg-tetra_hpc "< 0) + { + pluginerror = pluginerror + "PROBLEM tetrahpc2med command"; + cout< aVec = (*anIt).second; - nbtri += Max(aVec[SMDSEntity_Triangle],aVec[SMDSEntity_Quad_Triangle]); - nbqua += Max(aVec[SMDSEntity_Quadrangle],aVec[SMDSEntity_Quad_Quadrangle]); + std::vector aVec = (*anIt).second; + nbtri += std::max(aVec[SMDSEntity_Triangle],aVec[SMDSEntity_Quad_Triangle]); + nbqua += std::max(aVec[SMDSEntity_Quadrangle],aVec[SMDSEntity_Quad_Quadrangle]); GProp_GProps G; BRepGProp::SurfaceProperties(F,G); double anArea = G.Mass(); @@ -839,20 +443,20 @@ bool GHS3DPRLPlugin_GHS3DPRL::Evaluate(SMESH_Mesh& aMesh, } // collect info from edges - int nb0d_e = 0, nb1d_e = 0; + smIdType nb0d_e = 0, nb1d_e = 0; bool IsQuadratic = false; bool IsFirst = true; TopTools_MapOfShape tmpMap; for (TopExp_Explorer exp(aShape, TopAbs_EDGE); exp.More(); exp.Next()) { - TopoDS_Edge E = TopoDS::Edge(exp.Current()); + const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); if( tmpMap.Contains(E) ) continue; tmpMap.Add(E); SMESH_subMesh *aSubMesh = aMesh.GetSubMesh(exp.Current()); MapShapeNbElemsItr anIt = aResMap.find(aSubMesh); - std::vector aVec = (*anIt).second; + std::vector aVec = (*anIt).second; nb0d_e += aVec[SMDSEntity_Node]; - nb1d_e += Max(aVec[SMDSEntity_Edge],aVec[SMDSEntity_Quad_Edge]); + nb1d_e += std::max(aVec[SMDSEntity_Edge],aVec[SMDSEntity_Quad_Edge]); if(IsFirst) { IsQuadratic = (aVec[SMDSEntity_Quad_Edge] > aVec[SMDSEntity_Edge]); IsFirst = false; @@ -867,11 +471,11 @@ bool GHS3DPRLPlugin_GHS3DPRL::Evaluate(SMESH_Mesh& aMesh, double aVolume = G.Mass(); double tetrVol = 0.1179*ELen*ELen*ELen; double CoeffQuality = 0.9; - int nbVols = (int)aVolume/tetrVol/CoeffQuality; - int nb1d_f = (nbtri*3 + nbqua*4 - nb1d_e) / 2; - int nb1d_in = (int) ( nbVols*6 - nb1d_e - nb1d_f ) / 5; - std::vector aVec(SMDSEntity_Last); - for(int i=0; i aVec(SMDSEntity_Last); + for(smIdType i=0; i