From 0921263864977d53ebb778e3d1c9d88d61a4912f Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 27 Mar 2015 19:41:20 +0300 Subject: [PATCH] 22874: [CEA 1425] Performance SMESH Module Fix a leak of PropagationMgrData + Do not use volumes for preview of Extrusion + Fix a regression: empty groups are not removed with contents + avoid too long waiting at creation of hypotheses due to use of GEOMUtils::PreciseBoundingBox() in SMESH_Mesh::GetShapeDiagonalSize() --- .../gui/SMESH/images/quad_mesh_invalid.png | Bin 0 -> 12844 bytes doc/salome/gui/SMESH/images/quad_meshes.png | Bin 0 -> 17077 bytes doc/salome/gui/SMESH/input/about_hypo.doc | 21 ++++++-- doc/salome/gui/SMESH/input/about_meshes.doc | 8 ++- .../gui/SMESH/input/basic_meshing_algos.doc | 4 +- .../SMESH/input/constructing_submeshes.doc | 22 ++++---- doc/salome/gui/SMESH/input/editing_meshes.doc | 5 +- doc/salome/gui/SMESH/input/quad_ijk_algo.doc | 49 ++++++++++++++++++ src/SMESH/SMESH_Mesh.cxx | 33 ++++++++++-- src/SMESH_I/SMESH_Gen_i.cxx | 3 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 26 ++++++++++ src/SMESH_I/SMESH_Mesh_i.cxx | 15 +++--- 12 files changed, 155 insertions(+), 31 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/quad_mesh_invalid.png create mode 100644 doc/salome/gui/SMESH/images/quad_meshes.png create mode 100644 doc/salome/gui/SMESH/input/quad_ijk_algo.doc diff --git a/doc/salome/gui/SMESH/images/quad_mesh_invalid.png b/doc/salome/gui/SMESH/images/quad_mesh_invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..cce9980f54df66707144cc9d68580249673e5083 GIT binary patch literal 12844 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
  • \subpage a1d_meshing_hypo_page "1D Hypotheses" (for meshing of @@ -39,8 +55,7 @@ In \b MESH there are the following Basic Hypotheses: There also exist -\subpage additional_hypo_page "Additional Hypotheses" that can be used together -with main hypotheses: +\subpage additional_hypo_page "Additional Hypotheses":
    • \ref propagation_anchor "Propagation of 1D Hypothesis on opposite edges"
    • \ref propagofdistribution_anchor "Propagation of Node Distribution on Opposite Edges"
    • @@ -49,6 +64,4 @@ with main hypotheses:
    • \ref quadrangle_preference_anchor "Quadrangle preference"
    -The choice of a hypothesis depends on the selected algorithm. - */ diff --git a/doc/salome/gui/SMESH/input/about_meshes.doc b/doc/salome/gui/SMESH/input/about_meshes.doc index 60ad290a8..470cb854d 100644 --- a/doc/salome/gui/SMESH/input/about_meshes.doc +++ b/doc/salome/gui/SMESH/input/about_meshes.doc @@ -18,7 +18,7 @@ Mesh module provides several ways to create the mesh: objects). Construction of \subpage constructing_submeshes_page "sub-meshes" - allows to mesh some sub-shapes of the main shape, for example a face, + allows to discretize some sub-shapes of the main shape, for example a face, using different meshing parameters than other sub-shapes.
    Meshing parameters of meshes and sub-meshes can be \subpage editing_meshes_page "edited". (Upon edition only mesh entities @@ -58,6 +58,12 @@ Mesh module provides several ways to create the mesh: Meshes can be edited using the MESH functions destined for \ref modifying_meshes_page "modification" of meshes. +Attractive meshing capabilities include: +- 3D and 2D \ref viscous_layers_anchor "Viscous Layers" (boundary + layers of highly stretched elements beneficial for high quality + viscous computations); +- automatic conformal transition between tetrahedral and hexahedral + sub-meshes. The \b structure of a SALOME mesh is described by nodes and elements based on these nodes. Geometry of the element is defined by the sequence of diff --git a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc index bdf730b67..f494926d1 100644 --- a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc +++ b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc @@ -28,8 +28,8 @@ number of mesh segments following an 1D hypothesis.
    • Triangle (Mefisto) meshing algorithm - splits faces into triangular elements.
    • -
    • Quadrangle (Mapping) meshing algorithm - splits faces - into quadrangular elements.
    • +
    • \subpage quad_ijk_algo_page "Quadrangle (Mapping)" meshing + algorithm - splits faces into quadrangular elements.
    \image html image123.gif "Example of a triangular 2D mesh" diff --git a/doc/salome/gui/SMESH/input/constructing_submeshes.doc b/doc/salome/gui/SMESH/input/constructing_submeshes.doc index 8e750f6a2..9da2e4f7f 100644 --- a/doc/salome/gui/SMESH/input/constructing_submeshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_submeshes.doc @@ -89,13 +89,15 @@ The following dialog box will appear: \par \image html createmesh-inv2.png -\par It allows to define the \b Name, the parent \b Mesh and the \b Geometry (e.g. a face if the parent mesh has been built on box) of the sub-mesh. You can define meshing algorithms and hypotheses in the same way as -in \ref constructing_meshes_page "Create mesh" dialog. +in \ref constructing_meshes_page "Create mesh" dialog. + +Later you can change applied hypotheses or their parameters in +\ref editing_meshes_page "Edit mesh/sub-mesh" dialog. Mesh entities +generated using changed hypotheses are automatically removed. -\par \anchor subshape_by_mesh_elem If the parent mesh is already computed, then you can define the \b Geometry by picking mesh elements computed on a sub-shape of interest @@ -106,18 +108,14 @@ already down, then click it to release and then click it again. The following pop-up menu allowing to choose a way of geometry definition will appear. -\par \image html choose_geom_selection_way.png -\par Direct geometry selection enables selecting the sub-shape in the Object Browser. Find geometry by mesh element selection activates the following dialog. -\par \image html find_geom_by_mesh_elem.png -\par In this dialog, Element Type defines a kind of element to pick in the Viewer. Instead of picking an element in the Viewer, you can type its @@ -126,22 +124,20 @@ ID in Element ID field. with which the sub-shape will appear in the Object Browser (if not yet there). -\par In the Object Browser the structure of the new sub-mesh will be displayed as follows: \image html image10.jpg -\par It contains:
    • a sub-mesh name (\a SubMeshFace1)
    • a reference to the geometrical object on the basis of which the sub-mesh has been constructed (Cylindrical Face_1);
    • -
    • Applied hypotheses folder containing the references to the -hypotheses selected at the construction of the sub-mesh;
    • -
    • Applied algorithms folder containing the references to the -algorithms selected at the construction of the sub-mesh.
    • +
    • Applied hypotheses folder containing the references to the +hypotheses assigned to the sub-mesh;
    • +
    • Applied algorithms folder containing the references to the +algorithms assigned to the sub-mesh.

    See Also a sample TUI Script of a diff --git a/doc/salome/gui/SMESH/input/editing_meshes.doc b/doc/salome/gui/SMESH/input/editing_meshes.doc index 4cc70553f..a4602e6c4 100644 --- a/doc/salome/gui/SMESH/input/editing_meshes.doc +++ b/doc/salome/gui/SMESH/input/editing_meshes.doc @@ -16,10 +16,13 @@ You can also change values for the current hypothesis by clicking the \image html image122.png
    "Edit Hypothesis" button
    +Mesh entities generated before using changed hypotheses are automatically removed. + See how the mesh constructed on a geometrical object -changes if we apply different algorithms to it. +changes if we apply different meshing parameters to it. \image html edit_mesh1.png "Example of a mesh with Max. Element area 2D hypothesis roughly corresponding to 1D hypotheses on edges" +
    \image html edit_mesh_change_value_hyp.png "And now the Max Element area is greatly reduced" diff --git a/doc/salome/gui/SMESH/input/quad_ijk_algo.doc b/doc/salome/gui/SMESH/input/quad_ijk_algo.doc new file mode 100644 index 000000000..dfdb2d5cb --- /dev/null +++ b/doc/salome/gui/SMESH/input/quad_ijk_algo.doc @@ -0,0 +1,49 @@ +/*! + +\page quad_ijk_algo_page Quadrangle (Mapping) meshing algorithm + +Quadrangle (Mapping) meshing algorithm is intended for creating +all-quadrangle and quad-dominant meshes on faces with no holes and +bound by at least three edges. + +The algorithm can create mesh on any face but mesh quality and +validity depends on two factors: +- face shape (number of edges and concavity of boundary); +- discretization of edges. + +\image html quad_mesh_invalid.png "Invalid mesh on quadrilateral concave faces" + +The algorithm uses Transfinite Interpolation technic in +parametric space of a face to locate nodes inside the face. + +The algorithm treats any face as a quadrangle. If a face is bound by +more than four edges, four most sharp vertices are considered as +corners of the quadrangle and all edges between these vertices are +treated as quadrangle sides. In the case of three edges, the vertex +specified by the user is considered as a degenerated side of the +quadrangle. + +\image html quad_meshes.png "Algorithm generates a structured mesh on complex faces provided that edges are properly discretized" + +To get an all-quadrangle mesh you have to carefully define 1D +hypotheses on edges of a face. To get a \b structured mesh you have to assure +equal number of segments on opposite sides of the quadrangle. If this +condition is not respected, the algorithm by default (with no +hypothesis) creates \b quad-dominant mesh with triangles located near a +side with maximal number of segments. But you can get an +\b all-quadrangle mesh in this case by using +\ref hypo_quad_params_anchor "Quadrangle Parameters" +hypothesis to specify how to make transition mesh between opposite +sides with different number of segments, provided that certain +conditions are respected. In any case total number of segments must be +even. To use \a Reduced transition method there must be equal number +of segments on one pair of opposite sides. + +The following hypotheses help in creation of quadrangle meshes. +- \ref propagation_anchor "Propagation" additional 1D hypotheses + help to get equal number of segments on opposite sides of the + quadrilateral face. +- \ref a1d_algos_anchor "Composite Side Discretization" algorithm is useful + to discretize several C1 continues edges as one quadrangle side. + +*/ diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 20deb04a6..992e31735 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -58,7 +58,7 @@ #include #undef _Precision_HeaderFile -//#include +#include #include #include #include @@ -72,11 +72,12 @@ #include "SMESH_TryCatch.hxx" // include after OCCT headers! #include "Utils_ExceptHandlers.hxx" + #ifndef WIN32 #include #include #else -#include +include #endif using namespace std; @@ -180,6 +181,23 @@ SMESH_Mesh::~SMESH_Mesh() { MESSAGE("SMESH_Mesh::~SMESH_Mesh"); + // Unassign algorithms in order to have all SMESH_subMeshEventListenerData deleted (22874) + SMESHDS_SubMeshIteratorPtr smIt = _myMeshDS->SubMeshes(); + while ( smIt->more() ) { + // avoid usual removal of elements while processing RemoveHypothesis( algo ) event + const_cast( smIt->next() )->Clear(); + } + const ShapeToHypothesis & hyps = _myMeshDS->GetHypotheses(); + for ( ShapeToHypothesis::Iterator s2hyps( hyps ); s2hyps.More(); s2hyps.Next() ) + { + const TopoDS_Shape& s = s2hyps.Key(); + THypList hyps = s2hyps.ChangeValue(); // copy + THypList::const_iterator h = hyps.begin(); + for ( ; h != hyps.end(); ++h ) + if ( (*h)->GetType() != SMESHDS_Hypothesis::PARAM_ALGO ) + RemoveHypothesis( s, (*h)->GetID() ); + } + // issue 0020340: EDF 1022 SMESH : Crash with FindNodeClosestTo in a second new study // Notify event listeners at least that something happens if ( SMESH_subMesh * sm = GetSubMeshContaining(1)) @@ -329,7 +347,16 @@ double SMESH_Mesh::GetShapeDiagonalSize(const TopoDS_Shape & aShape) { if ( !aShape.IsNull() ) { Bnd_Box Box; - GEOMUtils::PreciseBoundingBox(aShape, Box); + // avoid too long waiting on large shapes. PreciseBoundingBox() was added + // to assure same result which else depends on presence of triangulation (IPAL52557). + const int maxNbFaces = 4000; + int nbFaces = 0; + for ( TopExp_Explorer f( aShape, TopAbs_FACE ); f.More() && nbFaces < maxNbFaces; f.Next() ) + ++nbFaces; + if ( nbFaces < maxNbFaces ) + GEOMUtils::PreciseBoundingBox(aShape, Box); + else + BRepBndLib::Add( aShape, Box); if ( !Box.IsVoid() ) return sqrt( Box.SquareExtent() ); } diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 715d6656a..468352968 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -747,7 +747,7 @@ SMESH_Gen_i::GetHypothesisParameterValues (const char* theHypType, return SMESH::SMESH_Hypothesis::_nil(); ::SMESH_Mesh* mesh = meshServant ? &meshServant->GetImpl() : (::SMESH_Mesh*)0; - // create a temporary hypothesis to know its dimention + // create a temporary hypothesis to know its dimension SMESH::SMESH_Hypothesis_var tmpHyp = this->createHypothesis( theHypType, theLibName ); SMESH_Hypothesis_i* hypServant = SMESH::DownCast( tmpHyp ); if ( !hypServant ) @@ -2427,6 +2427,7 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, // loop on sub-meshes for ( int i = 0; i < theMeshesArray.length(); i++) { + if ( CORBA::is_nil( theMeshesArray[i] )) continue; SMESH::SMESH_Mesh_var anInitMesh = theMeshesArray[i]->GetMesh(); if ( anInitMesh->_is_nil() ) continue; SMESH_Mesh_i* anInitImpl = SMESH::DownCast( anInitMesh ); diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index d233bb63f..519478d30 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -182,6 +182,12 @@ namespace MeshEditor_I { { GetMeshDS()->ClearMesh(); } + void Remove( SMDSAbs_ElementType type ) + { + SMDS_ElemIteratorPtr eIt = GetMeshDS()->elementsIterator( type ); + while ( eIt->more() ) + GetMeshDS()->RemoveFreeElement( eIt->next(), /*sm=*/0, /*fromGroups=*/false ); + } };// struct TPreviewMesh static SMESH_NodeSearcher * theNodeSearcher = 0; @@ -2398,6 +2404,10 @@ SMESH_MeshEditor_i::RotationSweepObjects(const SMESH::ListOfIDSources & theNodes << TVar( theTolerance ) << ", " << theMakeGroups << " )"; } + else + { + getPreviewMesh()->Remove( SMDSAbs_Volume ); + } return aGroups ? aGroups : new SMESH::ListOfGroups; @@ -2551,6 +2561,10 @@ SMESH_MeshEditor_i::ExtrusionSweepObjects(const SMESH::ListOfIDSources & theNode << TVar( theNbOfSteps ) << ", " << theToMakeGroups << " )"; } + else + { + getPreviewMesh()->Remove( SMDSAbs_Volume ); + } return aGroups ? aGroups : new SMESH::ListOfGroups; @@ -2623,6 +2637,10 @@ SMESH_MeshEditor_i::ExtrusionByNormal(const SMESH::ListOfIDSources& objects, << ", " << dim << " )"; } + else + { + getPreviewMesh()->Remove( SMDSAbs_Volume ); + } declareMeshModified( /*isReComputeSafe=*/true ); // does not influence Compute() @@ -2675,6 +2693,10 @@ SMESH_MeshEditor_i::AdvancedExtrusion(const SMESH::long_array & theIDsOfElements << theSewTolerance << ", " << theMakeGroups << " )"; } + else + { + getPreviewMesh()->Remove( SMDSAbs_Volume ); + } return aGroups ? aGroups : new SMESH::ListOfGroups; @@ -2844,6 +2866,10 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObjects(const SMESH::ListOfIDSources & the << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ), " << theMakeGroups << " )"; } + else + { + getPreviewMesh()->Remove( SMDSAbs_Volume ); + } return aGroups._retn(); diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index cc209d379..7649c27de 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -105,7 +105,7 @@ int SMESH_Mesh_i::_idGenerator = 0; SMESH_Mesh_i::SMESH_Mesh_i( PortableServer::POA_ptr thePOA, SMESH_Gen_i* gen_i, - CORBA::Long studyId ) + CORBA::Long studyId ) : SALOME::GenericObj_i( thePOA ) { MESSAGE("SMESH_Mesh_i"); @@ -1077,14 +1077,17 @@ void SMESH_Mesh_i::RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); - if ( theGroup->_is_nil() || theGroup->IsEmpty() ) + if ( theGroup->_is_nil() ) return; vector nodeIds; // to remove nodes becoming free - CORBA::Long elemID = theGroup->GetID( 1 ); - int nbElemNodes = GetElemNbNodes( elemID ); - if ( nbElemNodes > 0 ) - nodeIds.reserve( theGroup->Size() * nbElemNodes ); + if ( !theGroup->IsEmpty() ) + { + CORBA::Long elemID = theGroup->GetID( 1 ); + int nbElemNodes = GetElemNbNodes( elemID ); + if ( nbElemNodes > 0 ) + nodeIds.reserve( theGroup->Size() * nbElemNodes ); + } // Remove contents SMESH::SMESH_IDSource_var idSrc = SMESH::SMESH_IDSource::_narrow( theGroup ); -- 2.30.2