X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Hexa_3D.cxx;h=86f77bbd1a83d23f0db4d4d9ea1123b5f90178a6;hb=f65b9b8b24acedada2383fe274f330c8d8630468;hp=5db3700c2fe4cbc3af0cfe6ab4c7cb257b66a548;hpb=c98d9fcd7f02c1f1f5c24dd3e709ed75228d66c4;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.cxx b/src/StdMeshers/StdMeshers_Hexa_3D.cxx index 5db3700c2..86f77bbd1 100644 --- a/src/StdMeshers/StdMeshers_Hexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_Hexa_3D.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -20,7 +20,7 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH SMESH : implementaion of SMESH idl descriptions +// SMESH SMESH : implementation of SMESH idl descriptions // File : StdMeshers_Hexa_3D.cxx // Moved here from SMESH_Hexa_3D.cxx // Author : Paul RASCLE, EDF @@ -70,14 +70,14 @@ static bool EvaluatePentahedralMesh(SMESH_Mesh &, const TopoDS_Shape &, */ //============================================================================= -StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, int studyId, SMESH_Gen * gen) - :SMESH_3D_Algo(hypId, studyId, gen) +StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, SMESH_Gen * gen) + :SMESH_3D_Algo(hypId, gen) { - MESSAGE("StdMeshers_Hexa_3D::StdMeshers_Hexa_3D"); _name = "Hexa_3D"; _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type _requireShape = false; _compatibleHypothesis.push_back("ViscousLayers"); + _quadAlgo = new StdMeshers_Quadrangle_2D( gen->GetANewId(), _gen ); } //============================================================================= @@ -88,7 +88,8 @@ StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, int studyId, SMESH_Gen * gen) StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D() { - MESSAGE("StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D"); + delete _quadAlgo; + _quadAlgo = 0; } //============================================================================= @@ -191,7 +192,7 @@ namespace //================================================================================ /*! - * \brief Convertor of a pair of integers to a sole index + * \brief Converter of a pair of integers to a sole index */ struct _Indexer { @@ -233,7 +234,7 @@ namespace for ( int i = 1; i < 6; ++i ) { if ( !quad[i] ) continue; - for ( unsigned iS = 0; iS < quad[i]->side.size(); ++iS ) + for ( size_t iS = 0; iS < quad[i]->side.size(); ++iS ) { const StdMeshers_FaceSidePtr side2 = quad[i]->side[iS]; if (( side->FirstVertex().IsSame( side2->FirstVertex() ) || @@ -246,9 +247,9 @@ namespace if ( iS != Q_BOTTOM ) { vector< FaceQuadStruct::Side > newSides; - for ( unsigned j = iS; j < quad[i]->side.size(); ++j ) + for ( size_t j = iS; j < quad[i]->side.size(); ++j ) newSides.push_back( quad[i]->side[j] ); - for ( unsigned j = 0; j < iS; ++j ) + for ( size_t j = 0; j < iS; ++j ) newSides.push_back( quad[i]->side[j] ); quad[i]->side.swap( newSides ); } @@ -353,7 +354,6 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, { // PAL14921. Enable catching std::bad_alloc and Standard_OutOfMemory outside //Unexpect aCatch(SalomeException); - MESSAGE("StdMeshers_Hexa_3D::Compute"); SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); // Shape verification @@ -366,11 +366,11 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, if ( exp.Next(), exp.More() ) return error(COMPERR_BAD_SHAPE, "More than one SHELL in the geometry"); - TopTools_IndexedMapOfShape FF; + TopTools_IndexedMapOfShape FF, EE; TopExp::MapShapes( aShape, TopAbs_FACE, FF); if ( FF.Extent() != 6) { - static StdMeshers_CompositeHexa_3D compositeHexa(_gen->GetANewId(), 0, _gen); + static StdMeshers_CompositeHexa_3D compositeHexa(_gen->GetANewId(), _gen); if ( !compositeHexa.Compute( aMesh, aShape )) return error( compositeHexa.GetComputeError() ); return true; @@ -378,13 +378,23 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, // Find sides of a cube // --------------------- - + + // tool creating quadratic elements if needed + SMESH_MesherHelper helper (aMesh); + _quadraticMesh = helper.IsQuadraticSubMesh(aShape); + + TopExp::MapShapes( aShape, TopAbs_EDGE, EE ); + SMESH_MesherHelper* faceHelper = ( EE.Size() == 12 ) ? 0 : &helper; + FaceQuadStructPtr quad[ 6 ]; - StdMeshers_Quadrangle_2D quadAlgo( _gen->GetANewId(), GetStudyId(), _gen); for ( int i = 0; i < 6; ++i ) { - if ( !( quad[i] = FaceQuadStructPtr( quadAlgo.CheckNbEdges( aMesh, FF( i+1 ))))) - return error( quadAlgo.GetComputeError() ); + if ( faceHelper ) + faceHelper->SetSubShape( FF( i+1 )); + if ( !( quad[i] = FaceQuadStructPtr( _quadAlgo->CheckNbEdges( aMesh, FF( i+1 ), + /*considerMesh=*/true, + faceHelper)))) + return error( _quadAlgo->GetComputeError() ); if ( quad[i]->side.size() != 4 ) return error( COMPERR_BAD_SHAPE, "Not a quadrangular box side" ); } @@ -439,10 +449,6 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, // Check presence of regular grid mesh on FACEs of the cube // ------------------------------------------------------------ - // tool creating quadratic elements if needed - SMESH_MesherHelper helper (aMesh); - _quadraticMesh = helper.IsQuadraticSubMesh(aShape); - for ( int i = 0; i < 6; ++i ) { const TopoDS_Face& F = aCubeSide[i]._quad->face; @@ -515,8 +521,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, if ( proxymesh ) for ( int i = 0; i < 6; ++i ) - for ( unsigned j = 0; j < aCubeSide[i]._columns.size(); ++j) - for ( unsigned k = 0; k < aCubeSide[i]._columns[j].size(); ++k) + for ( size_t j = 0; j < aCubeSide[i]._columns.size(); ++j) + for ( size_t k = 0; k < aCubeSide[i]._columns[j].size(); ++k) { const SMDS_MeshNode* & n = aCubeSide[i]._columns[j][k]; n = proxymesh->GetProxyNode( n ); @@ -701,7 +707,7 @@ bool StdMeshers_Hexa_3D::Evaluate(SMESH_Mesh & aMesh, } if (meshFaces.size() != 6) { //return error(COMPERR_BAD_SHAPE, TComm(meshFaces.size())<<" instead of 6 faces in a block"); - static StdMeshers_CompositeHexa_3D compositeHexa(-10, 0, aMesh.GetGen()); + static StdMeshers_CompositeHexa_3D compositeHexa(-10, aMesh.GetGen()); return compositeHexa.Evaluate(aMesh, aShape, aResMap); } @@ -811,7 +817,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelper static StdMeshers_HexaFromSkin_3D * algo = 0; if ( !algo ) { SMESH_Gen* gen = aMesh.GetGen(); - algo = new StdMeshers_HexaFromSkin_3D( gen->GetANewId(), 0, gen ); + algo = new StdMeshers_HexaFromSkin_3D( gen->GetANewId(), gen ); } algo->InitComputeError(); algo->Compute( aMesh, aHelper ); @@ -879,7 +885,7 @@ SMESH_ComputeErrorPtr ComputePentahedralMesh(SMESH_Mesh & aMesh, static StdMeshers_Prism_3D * aPrism3D = 0; if ( !aPrism3D ) { SMESH_Gen* gen = aMesh.GetGen(); - aPrism3D = new StdMeshers_Prism_3D( gen->GetANewId(), 0, gen ); + aPrism3D = new StdMeshers_Prism_3D( gen->GetANewId(), gen ); } SMESH_Hypothesis::Hypothesis_Status aStatus; if ( aPrism3D->CheckHypothesis( aMesh, aShape, aStatus ) ) { @@ -910,7 +916,7 @@ bool EvaluatePentahedralMesh(SMESH_Mesh & aMesh, static StdMeshers_Prism_3D * aPrism3D = 0; if ( !aPrism3D ) { SMESH_Gen* gen = aMesh.GetGen(); - aPrism3D = new StdMeshers_Prism_3D( gen->GetANewId(), 0, gen ); + aPrism3D = new StdMeshers_Prism_3D( gen->GetANewId(), gen ); } SMESH_Hypothesis::Hypothesis_Status aStatus; if ( aPrism3D->CheckHypothesis( aMesh, aShape, aStatus ) ) {