From b131becc0872f2050b117ce5bfc0fda84e34faa6 Mon Sep 17 00:00:00 2001 From: Yoann Audouin Date: Mon, 10 Oct 2022 09:34:15 +0200 Subject: [PATCH] Adding user documentation --- .../examples/create_dual_mesh.py | 14 ++--- doc/examples/tests.set | 1 + doc/gui/CMakeLists.txt | 2 +- doc/gui/images/create_dual_mesh_dlg.png | Bin 0 -> 11000 bytes doc/gui/input/about_meshes.rst | 21 ++++--- doc/gui/input/create_dual_mesh.rst | 42 ++++++++++++++ doc/gui/input/tui_creating_meshes.rst | 16 +++++- src/SMESHGUI/SMESHGUI_CreateDualMeshOp.cxx | 3 +- src/SMESH_I/SMESH_Gen_i.cxx | 1 + src/SMESH_SWIG/smesh_tools.py | 52 ++++++++++++++++-- test/SMESH_create_dual_mesh_adapt.py | 2 + test/tests.set | 1 - 12 files changed, 128 insertions(+), 27 deletions(-) rename test/SMESH_create_dual_mesh.py => doc/examples/create_dual_mesh.py (90%) create mode 100644 doc/gui/images/create_dual_mesh_dlg.png create mode 100644 doc/gui/input/create_dual_mesh.rst diff --git a/test/SMESH_create_dual_mesh.py b/doc/examples/create_dual_mesh.py similarity index 90% rename from test/SMESH_create_dual_mesh.py rename to doc/examples/create_dual_mesh.py index 08621f30e..08dfea822 100644 --- a/test/SMESH_create_dual_mesh.py +++ b/doc/examples/create_dual_mesh.py @@ -1,8 +1,5 @@ -#!/usr/bin/env python +# Creating dual Mesh -### -### This file is generated automatically by SALOME v9.9.0 with dump python functionality -### import sys import salome @@ -22,6 +19,7 @@ import math import SALOMEDS +# Creating a sphere geompy = geomBuilder.New() O = geompy.MakeVertex(0, 0, 0) @@ -36,20 +34,20 @@ geompy.addToStudy( OY, 'OY' ) geompy.addToStudy( OZ, 'OZ' ) geompy.addToStudy( Sphere_1, 'Sphere_1' ) -### -### SMESH component -### - import SMESH, SALOMEDS from salome.smesh import smeshBuilder smesh = smeshBuilder.New() +# Meshing sphere in Tetrahedron NETGEN_3D_Parameters_1 = smesh.CreateHypothesisByAverageLength( 'NETGEN_Parameters', 'NETGENEngine', 34.641, 0 ) Mesh_1 = smesh.Mesh(Sphere_1,'Mesh_1') status = Mesh_1.AddHypothesis( Sphere_1, NETGEN_3D_Parameters_1 ) NETGEN_1D_2D_3D = Mesh_1.Tetrahedron(algo=smeshBuilder.NETGEN_1D2D3D) isDone = Mesh_1.Compute() + + +# Creating Dual mesh dual_Mesh_1 = smesh.CreateDualMesh( Mesh_1, 'dual_Mesh_1', True) diff --git a/doc/examples/tests.set b/doc/examples/tests.set index cb22edab5..df39d9dd9 100644 --- a/doc/examples/tests.set +++ b/doc/examples/tests.set @@ -128,6 +128,7 @@ SET(BAD_TESTS transforming_meshes_ex06.py viewing_meshes_ex01.py radial_prism_3d_algo.py + create_dual_mesh.py ) IF(NOT WIN32) LIST(APPEND BAD_TESTS diff --git a/doc/gui/CMakeLists.txt b/doc/gui/CMakeLists.txt index c85b76e94..26660b650 100644 --- a/doc/gui/CMakeLists.txt +++ b/doc/gui/CMakeLists.txt @@ -57,7 +57,7 @@ SET(_cmd_smeshBuilder_gen_options ${smesh_merge_file} -o tmp2/smeshBuilder.py sm SALOME_GENERATE_ENVIRONMENT_SCRIPT(_cmd_smeshBuilder_gen env_script "${PYTHON_EXECUTABLE}" "${_cmd_smeshBuilder_gen_options}" CONTEXT "SMESH_DOC" ADDITIONAL_VARIABLES ${ADD_VAR}) ADD_CUSTOM_TARGET(pre_usr_docs - # 1. Make temporary directories for python modules + # 1. Make temporary directories for python modules COMMAND ${CMAKE_COMMAND} -E make_directory tmp1 COMMAND ${CMAKE_COMMAND} -E make_directory tmp2 diff --git a/doc/gui/images/create_dual_mesh_dlg.png b/doc/gui/images/create_dual_mesh_dlg.png new file mode 100644 index 0000000000000000000000000000000000000000..b28beaaf83f28c62ed22b23baccd167ed71579a3 GIT binary patch literal 11000 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 literal 0 HcmV?d00001 diff --git a/doc/gui/input/about_meshes.rst b/doc/gui/input/about_meshes.rst index 270fbe5e1..73af1714e 100644 --- a/doc/gui/input/about_meshes.rst +++ b/doc/gui/input/about_meshes.rst @@ -1,8 +1,8 @@ -.. _about_meshes_page: +.. _about_meshes_page: ************ About meshes -************ +************ **MESH** represents a discrete approximation of a subset of the three-dimensional space by `elementary geometrical elements`_. @@ -10,7 +10,7 @@ A SALOME study can contain multiple meshes, but they do not implicitly compose o Mesh module provides several ways to create the mesh: -* The main way is to :ref:`construct the mesh ` on the basis of the geometrical shape produced in the Geometry module. This way implies selection of +* The main way is to :ref:`construct the mesh ` on the basis of the geometrical shape produced in the Geometry module. This way implies selection of * a geometrical object (*main shape*) and * *meshing parameters* (:ref:`meshing algorithms ` and characteristics (e.g. element size) of a required mesh encapsulated in :ref:`hypothesis ` objects). @@ -20,19 +20,21 @@ Mesh module provides several ways to create the mesh: .. note:: Algorithms and hypotheses used at mesh level are referred to as *global* ones and those used at sub-mesh level are referred to as *local* ones. - + * Bottom-up way, using :ref:`mesh modification ` operations, especially :ref:`extrusion ` and :ref:`revolution `. To create an empty mesh not based on geometry, use the same dialog as to :ref:`construct the mesh on geometry ` but specify neither the geometry nor meshing algorithms. - + * The mesh can be :ref:`imported ` from (and exported to) the file in MED, UNV, STL, CGNS, DAT and GMF formats. - + * The 3D mesh can be generated from the 2D mesh not based on geometry, which was either :ref:`imported ` or created in other way. To setup the meshing parameters of a mesh not based on geometry, just invoke :ref:`Edit mesh / sub-mesh ` command on your 2D mesh. - + * Several meshes can be :ref:`combined ` into a new mesh. - + * The whole mesh or its part (sub-mesh or group) can be :ref:`copied ` into a new mesh. - + * A new mesh can be created from a transformed, e.g. :ref:`translated `, part of the mesh. +* A new mesh can be created from the gernation of the :ref:`dual ` of a Tetrahedron Mesh. + Meshes can be edited using the MESH functions destined for :ref:`modification ` of meshes. @@ -82,4 +84,5 @@ Quadratic mesh can be obtained in three ways: importing_exporting_meshes.rst building_compounds.rst copy_mesh.rst + create_dual_mesh.rst connectivity.rst diff --git a/doc/gui/input/create_dual_mesh.rst b/doc/gui/input/create_dual_mesh.rst new file mode 100644 index 000000000..2a540a1c6 --- /dev/null +++ b/doc/gui/input/create_dual_mesh.rst @@ -0,0 +1,42 @@ +.. _create_dual_mesh_page: + +**************** +Create Dual Mesh +**************** + +We can create the dual of a Tetrahedron Mesh which will be a polyhedron mesh. +The Mesh is created using MEDCoupling computeDualMesh function. + +*To create a dual mesh:* + +.. |img| image:: ../images/create_dual_mesh_icon.png + +From the contextual menu in the Object Browser of from the **Mesh** menu select +**Create Dual Mesh** or click *"Create Dual Mesh"* button |img| in the toolbar. + +The following dialog box will appear: + +.. image:: ../images/create_dual_mesh_dlg.png + :align: center + +In the dialog: + +* specify the mesh for which to create the dual mesh: + * **Select whole mesh** from the study tree. If a mesh was selected before calling function it will be preselected. + * If the mesh is not made of only Tetrahedrons a error message will be displayed and you won't be allowed to go through. +* specify the **New Mesh Name**; +* activate **Project boundary elements on shape** for the boundary points of the + dual mesh to be projected on their associated shape. + +* Click **Apply** or **Apply and Close** button to confirm the operation. + +---------------------------- +Limitations of the dual mesh +---------------------------- + +Only 2d groups will be transferred to the dual mesh. + +If you have convex shape the projection might not improve the mesh. + + +**See Also** a sample script of :ref:`tui_create_dual_mesh`. diff --git a/doc/gui/input/tui_creating_meshes.rst b/doc/gui/input/tui_creating_meshes.rst index 9d3cb5077..253fbf260 100644 --- a/doc/gui/input/tui_creating_meshes.rst +++ b/doc/gui/input/tui_creating_meshes.rst @@ -70,7 +70,7 @@ Export of a Mesh :download:`Download this script <../../examples/creating_meshes_ex05.py>` -.. _how_to_mesh_a_cylinder_with_hexahedrons: +.. _how_to_mesh_a_cylinder_with_hexahedrons: How to mesh a cylinder with hexahedrons? ======================================== @@ -84,10 +84,10 @@ demonstrates the resulting mesh. :download:`Download this script <../../examples/creating_meshes_ex06.py>` .. image:: ../images/mesh_cylinder_hexa.png - :align: center + :align: center -.. _tui_building_compound: +.. _tui_building_compound: Building a compound of meshes ============================= @@ -107,3 +107,13 @@ Mesh Copying :download:`Download this script <../../examples/creating_meshes_ex08.py>` +.. _tui_create_dual_mesh: + +Creating Dual Mesh +================== + +.. literalinclude:: ../../examples/create_dual_mesh.py + :language: python + +:download:`Download this script <../../examples/create_dual_mesh.py>` + diff --git a/src/SMESHGUI/SMESHGUI_CreateDualMeshOp.cxx b/src/SMESHGUI/SMESHGUI_CreateDualMeshOp.cxx index 4ee81382a..c0fed0340 100644 --- a/src/SMESHGUI/SMESHGUI_CreateDualMeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_CreateDualMeshOp.cxx @@ -150,9 +150,10 @@ void SMESHGUI_CreateDualMeshOp::selectionDone() { SMESH::SMESH_subMesh_var subMesh = SMESH::SObjectToInterface( pObj ); - // TODO: Check that mesh is only tetra + // Check that mesh is only tetra if (!checkMesh(idSource)){ myDlg->ShowWarning( true ); + myDlg->setButtonEnabled(false, QtxDialog::OK|QtxDialog::Apply); } } std::string mesh_name = "dual_" + pObj->GetName(); diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 0fd53cbc7..f6abcbdce 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -2885,6 +2885,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateDualMesh(SMESH::SMESH_IDSource_ptr mesh SMESH_Mesh& newMesh2 = newMesh_i->GetImpl(); + MESSAGE("Loading file: " << dual_mesh_file.string() << " with mesh " << mesh_name); newMesh2.MEDToMesh(dual_mesh_file.c_str(), meshName); MESSAGE("Imported created MED") diff --git a/src/SMESH_SWIG/smesh_tools.py b/src/SMESH_SWIG/smesh_tools.py index 1a6995eed..3d95f730c 100644 --- a/src/SMESH_SWIG/smesh_tools.py +++ b/src/SMESH_SWIG/smesh_tools.py @@ -4,6 +4,7 @@ import sys import salome import medcoupling as mc from math import pi +import numpy as np #salome.salome_init() @@ -17,6 +18,10 @@ from salome.smesh import smeshBuilder smesh = smeshBuilder.New() +from salome.kernel.logger import Logger +logger = Logger("salome.smesh.smesh_tools") +logger.setLevel("DEBUG") + def smesh_create_dual_mesh(mesh_ior, output_file, adapt_to_shape=True, mesh_name="MESH"): """ Create a dual of the mesh in input_file into output_file @@ -31,15 +36,51 @@ def smesh_create_dual_mesh(mesh_ior, output_file, adapt_to_shape=True, mesh_name shape = mesh.GetShapeToMesh() + # Creating output file + myfile = mc.MEDFileUMesh() + myfile.setName(mesh_name) + + # We got a meshProxy so we need to convert pointer to MEDCoupling int_ptr = mesh.ExportMEDCoupling(True, True) dab = mc.FromPyIntPtrToDataArrayByte(int_ptr) - tetras = mc.MEDFileMesh.New(dab)[0] + mc_mesh_file = mc.MEDFileMesh.New(dab) + tetras = mc_mesh_file[0] # End of SMESH -> MEDCoupling part for dualmesh tetras = mc.MEDCoupling1SGTUMesh(tetras) polyh = tetras.computeDualMesh() - dual_volume_raw = polyh.getMeasureField(True).accumulate()[0] + + ## Adding skin + transfering groups on faces from tetras mesh + mesh2d = polyh.buildUnstructured().computeSkin() + mesh2d.setName(mesh_name) + myfile.setMeshAtLevel(-1, mesh2d) + + + for grp_name in mc_mesh_file.getGroupsOnSpecifiedLev(-1): + logger.debug("Transferring group: "+ grp_name) + grp_tria = mc_mesh_file.getGroup(-1, grp_name) + # Retrieve the nodes in group + grp_nodes = grp_tria.computeFetchedNodeIds() + # Find all the cells lying on one of the nodes + id_grp_poly = mesh2d.getCellIdsLyingOnNodes(grp_nodes, False) + + grp_poly = mesh2d[id_grp_poly] + + # We use the interpolation to remove the element that are not really in + # the group (the ones that are next to a nodes nut not in the group + # will have the sum of their column in the enterpolation matrix equal + # to zero) + rem = mc.MEDCouplingRemapper() + + rem.prepare(grp_poly, grp_tria, "P0P0") + m = rem.getCrudeCSRMatrix() + _, id_to_keep = np.where(m.sum(dtype=np.int64, axis=0) >= 1e-07) + + id_grp_poly = id_grp_poly[id_to_keep.tolist()] + id_grp_poly.setName(grp_name) + + myfile.addGroup(-1, id_grp_poly) # Getting list of new points added on the skin skin = tetras.buildUnstructured().computeSkin() @@ -50,6 +91,7 @@ def smesh_create_dual_mesh(mesh_ior, output_file, adapt_to_shape=True, mesh_name ptsAddedMesh = mc.MEDCouplingUMesh.Build0DMeshFromCoords( skin_polyh.getCoords()[ptsAdded] ) if adapt_to_shape: + logger.debug("Adapting to shape") ptsAddedCoo = ptsAddedMesh.getCoords() ptsAddedCooModified = ptsAddedCoo[:] @@ -58,7 +100,6 @@ def smesh_create_dual_mesh(mesh_ior, output_file, adapt_to_shape=True, mesh_name id2face = {} for face in faces: id2face[face.GetSubShapeIndices()[0]] = face - print(id2face) ## Projecting each points added by the dual mesh on the surface it is # associated with @@ -74,4 +115,7 @@ def smesh_create_dual_mesh(mesh_ior, output_file, adapt_to_shape=True, mesh_name polyh.getCoords()[ptsAdded] = ptsAddedCooModified polyh.setName(mesh_name) - polyh.write(output_file) + myfile.setMeshAtLevel(0, polyh) + + logger.debug("Writting dual mesh in :"+output_file) + myfile.write(output_file, 2) diff --git a/test/SMESH_create_dual_mesh_adapt.py b/test/SMESH_create_dual_mesh_adapt.py index c95e6a62e..9f79618da 100644 --- a/test/SMESH_create_dual_mesh_adapt.py +++ b/test/SMESH_create_dual_mesh_adapt.py @@ -80,6 +80,8 @@ isDone = Mesh_1.Compute() dual_Mesh_1 = smesh.CreateDualMesh(Mesh_1, 'dual_Mesh_1', True) dual_Mesh_raw_1 = smesh.CreateDualMesh(Mesh_1, 'dual_Mesh_1', False) +[ top_2, middle_2, bottom_2 ] = dual_Mesh_1.GetGroups() + #Comparing volumes dual_volume = dual_Mesh_1.GetVolume() dual_raw_volume = dual_Mesh_raw_1.GetVolume() diff --git a/test/tests.set b/test/tests.set index 977f4a667..fddb00249 100644 --- a/test/tests.set +++ b/test/tests.set @@ -62,7 +62,6 @@ SET(BAD_TESTS SMESH_test1.py SMESH_test2.py SMESH_test4.py - SMESH_create_dual_mesh.py SMESH_create_dual_mesh_adapt.py ) IF(NOT WIN32) -- 2.39.2