X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGHS3DPRLPlugin%2FGHS3DPRLPlugin_GHS3DPRL.cxx;h=eb92f305a1ed48d3831a05c7024d524546c548b8;hb=6d8c94187119deb2671b65ffc8a0add3ca72b902;hp=d08bc1fdc191c5cef9878dc35321de6fd1585755;hpb=2ef49676937b1469bf69564c59449c194de7005b;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 d08bc1f..eb92f30 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 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 -using namespace std; +#define GMFVERSION GmfDouble +#define GMFDIMENSION 3 -/* -#include -//#include -#include -//#include -#include -using namespace med_2_2;*/ +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(); } } @@ -442,357 +164,264 @@ static TCollection_AsciiString getTmpDir() return aTmpDir; } +//============================================================================= +// 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) +{ + int meshID = theTetraInput->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 )); + } + + // 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 ); +} + //============================================================================= // 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) +bool GHS3DPRLPlugin_GHS3DPRL::Compute(SMESH_Mesh& theMesh, + const TopoDS_Shape& /*theShape*/) { - 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 "<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 - }*/ + 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; + + if (casenamemed.Length()>20){ + casenamemed=casenamemed.SubString(1,20); + cerr<<"MEDName truncated (no more 20 characters) = "< 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(); @@ -814,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; @@ -842,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