X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FTools%2FblocFissure%2Fgmu%2FinsereFissureLongue_c.py;h=c8b8578d42891deb8a775a31fa46c9f8c021cbaf;hp=4cdb8b29b595e27dfcc4e92173d97c3284c13b9d;hb=13469a2390c6d6061a023967950aa3b3a1196bb2;hpb=33b6f8700337fa00f3e48076a6f6d8df87d8e57f diff --git a/src/Tools/blocFissure/gmu/insereFissureLongue_c.py b/src/Tools/blocFissure/gmu/insereFissureLongue_c.py index 4cdb8b29b..c8b8578d4 100644 --- a/src/Tools/blocFissure/gmu/insereFissureLongue_c.py +++ b/src/Tools/blocFissure/gmu/insereFissureLongue_c.py @@ -17,63 +17,100 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -"""Insertion de fissure longue - maillage face de fissure""" +"""Insertion de fissure longue - maillage pipe fond fissure""" import logging -import salome -from .geomsmesh import smesh +import math + from salome.smesh import smeshBuilder import SMESH -from .putName import putName +from .geomsmesh import geompy +from .geomsmesh import smesh -import math +from .sortEdges import sortEdges +from .putName import putName +from .distance2 import distance2 -def insereFissureLongue_c (faceFiss, edgePeauFiss, groupEdgesPeauFiss, group_generFiss, groupEdgesFaceFissPipe, \ +def insereFissureLongue_c (pipeFondFiss, disques, rayons, demiCercles, demiCerclesPeau, generatrices, \ + VerticesEndPipeFiss, verticesEdgePeauFiss, \ + groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss, \ profondeur, rayonPipe, \ - mailleur="MeshGems"): - """maillage face de fissure""" + nro_cas=None): + """maillage pipe fond fissure""" logging.info('start') + logging.info("Maillage pour le cas n°%s", nro_cas) - meshFaceFiss = smesh.Mesh(faceFiss) - mesh_size = (profondeur - rayonPipe)/math.sqrt(3.0) # pour avoir deux couches de triangles equilateraux partout sur la fissure - logging.info("Maillage avec %s", mailleur) - if ( mailleur == "MeshGems"): - algo2d = meshFaceFiss.Triangle(algo=smeshBuilder.MG_CADSurf) - hypo2d = algo2d.Parameters() - hypo2d.SetPhySize( mesh_size ) - hypo2d.SetMinSize( mesh_size/10. ) - hypo2d.SetMaxSize( mesh_size*3. ) - hypo2d.SetChordalError( mesh_size*0.25 ) - hypo2d.SetVerbosity( 0 ) - else: - algo2d = meshFaceFiss.Triangle(algo=smeshBuilder.NETGEN_2D) - hypo2d = algo2d.Parameters() - hypo2d.SetMaxSize( mesh_size ) - hypo2d.SetOptimize( 1 ) - hypo2d.SetFineness( 2 ) - hypo2d.SetMinSize( 2 ) - hypo2d.SetQuadAllowed( 0 ) - putName(algo2d.GetSubMesh(), "faceFiss") - putName(algo2d, "algo2d_faceFiss") - putName(hypo2d, "hypo2d_faceFiss") - # - algo1d = meshFaceFiss.UseExisting1DElements(geom=edgePeauFiss) - hypo1d = algo1d.SourceEdges([ groupEdgesPeauFiss ],0,0) - putName(algo1d.GetSubMesh(), "edgeFissPeau") - putName(algo1d, "algo1d_edgeFissPeau") - putName(hypo1d, "hypo1d_edgeFissPeau") - # - algo1d = meshFaceFiss.UseExisting1DElements(geom=groupEdgesFaceFissPipe) - hypo1d = algo1d.SourceEdges([ group_generFiss ],0,0) - putName(algo1d.GetSubMesh(), "edgeFissPeau") - putName(algo1d, "algo1d_edgeFissPeau") - putName(hypo1d, "hypo1d_edgeFissPeau") - - _ = meshFaceFiss.GroupOnGeom(faceFiss, "fisOutPi", SMESH.FACE) - - is_done = meshFaceFiss.Compute() - text = "meshFaceFiss.Compute" + meshFondFiss = smesh.Mesh(pipeFondFiss) + putName(meshFondFiss, "pipeFondFiss", i_pref=nro_cas) + + algo3d = meshFondFiss.Prism() + putName(algo3d.GetSubMesh(), "pipe", i_pref=nro_cas) + putName(algo3d, "Prism", i_pref=nro_cas) + + algo2d = meshFondFiss.Quadrangle(algo=smeshBuilder.QUADRANGLE) + putName(algo2d, "QUADRANGLE", i_pref=nro_cas) + + for i_aux, face in enumerate(disques): + #print (i_aux) + # la commande suivante entraîne addToStudy() failed + algo2d = meshFondFiss.Quadrangle(algo=smeshBuilder.RADIAL_QUAD,geom=face) + putName(algo2d.GetSubMesh(), "disque", i_aux, nro_cas) + putName(algo2d, "RADIAL_QUAD", i_aux, nro_cas) + + for i_aux, edge in enumerate(rayons): + algo1d = meshFondFiss.Segment(geom=edge) + hypo1d = algo1d.NumberOfSegments(4) + putName(algo1d.GetSubMesh(), "rayon", i_aux, nro_cas) + putName(algo1d, "algo1d_rayon", i_aux, nro_cas) + putName(hypo1d, "hypo1d_rayon", i_aux, nro_cas) + + for i_aux, edge in enumerate(demiCercles): + algo1d = meshFondFiss.Segment(geom=edge) + hypo1d = algo1d.NumberOfSegments(6) + putName(algo1d.GetSubMesh(), "demiCercle", i_aux, nro_cas) + putName(algo1d, "algo1d_demiCercle", i_aux, nro_cas) + putName(hypo1d, "hypo1d_demiCercle", i_aux, nro_cas) + + generSorted, minlg, maxlg = sortEdges(generatrices) + nbSegGenLong = int(math.sqrt(3.0)*maxlg/(profondeur - rayonPipe)) # on veut 2 triangles equilateraux dans la largeur de la face + nbSegGenBout = 6 + logging.info("min %s, max %s, nombre de segments %s, nombre de generatrices %s", minlg, maxlg, nbSegGenLong, len(generSorted)) + for i_aux, edge in enumerate(generSorted): + algo1d = meshFondFiss.Segment(geom=edge) + if i_aux < 6: + hypo1d = algo1d.NumberOfSegments(nbSegGenBout) + else: + hypo1d = algo1d.NumberOfSegments(nbSegGenLong) + putName(algo1d.GetSubMesh(), "generatrice", i_aux, nro_cas) + putName(algo1d, "algo1d_generatrice", i_aux, nro_cas) + putName(hypo1d, "hypo1d_generatrice", i_aux, nro_cas) + + disks = list() + for i_aux, face in enumerate(disques[:4]): + name = "disk{}".format(i_aux) + disks.append(meshFondFiss.GroupOnGeom(face, name, SMESH.FACE)) + _ = meshFondFiss.GetMesh().UnionListOfGroups( disks, 'PEAUEXT' ) + + _ = meshFondFiss.GroupOnGeom(VerticesEndPipeFiss[0], "PFOR", SMESH.NODE) + _ = meshFondFiss.GroupOnGeom(VerticesEndPipeFiss[1], "PFEX", SMESH.NODE) + + _ = meshFondFiss.GroupOnGeom(groupFaceFissInPipe, "fisInPi", SMESH.FACE) + _ = meshFondFiss.GroupOnGeom(groupEdgeFondFiss, "FONDFISS", SMESH.EDGE) + _ = meshFondFiss.GroupOnGeom(groupEdgeFondFiss, "nfondfis", SMESH.NODE) + + groups_demiCercles = list() + groupnodes_demiCercles = list() + for i_aux, group in enumerate(groupsDemiCerclesPipe): + name = "Cercle{}".format(i_aux) + groups_demiCercles.append(meshFondFiss.GroupOnGeom(group, name, SMESH.EDGE)) + name = "nCercle{}".format(i_aux) + groupnodes_demiCercles.append(meshFondFiss.GroupOnGeom(group, name, SMESH.NODE)) + group_generFiss = meshFondFiss.GroupOnGeom(groupGenerFiss, "GenFiss", SMESH.EDGE) + groupnode_generFiss = meshFondFiss.GroupOnGeom(groupGenerFiss, "GenFiss", SMESH.NODE) + + is_done = meshFondFiss.Compute() + text = "meshFondFiss.Compute" if is_done: logging.info(text+" OK") else: @@ -81,4 +118,36 @@ def insereFissureLongue_c (faceFiss, edgePeauFiss, groupEdgesPeauFiss, group_gen logging.info(text) raise Exception(text) - return meshFaceFiss + grpNode0 = meshFondFiss.IntersectGroups(groupnode_generFiss, groupnodes_demiCercles[0], "Node0") + grpNode1 = meshFondFiss.IntersectGroups(groupnode_generFiss, groupnodes_demiCercles[1], "Node1") + idNode0 = grpNode0.GetID(1) + idNode1 = grpNode1.GetID(1) + coordsMesh = list() + coordsMesh.append(meshFondFiss.GetNodeXYZ(idNode0)) + coordsMesh.append(meshFondFiss.GetNodeXYZ(idNode1)) + + for vertex in verticesEdgePeauFiss: + coord = geompy.PointCoordinates(vertex) + if distance2(coord, coordsMesh[0]) < 0.1: + meshFondFiss.MoveNode(idNode0, coord[0], coord[1], coord[2]) + if distance2(coord, coordsMesh[1]) < 0.1: + meshFondFiss.MoveNode(idNode1, coord[0], coord[1], coord[2]) + + for groupNodes in groupnodes_demiCercles: + for idNode in groupNodes.GetListOfID(): + coordMesh = meshFondFiss.GetNodeXYZ(idNode) + vertex = geompy.MakeVertex(coordMesh[0], coordMesh[1], coordMesh[2]) + minDist = 100000 + minCoord = None + imin = -1 + for i_aux, edge in enumerate(demiCerclesPeau): + discoord = geompy.MinDistanceComponents(vertex, edge) + if discoord[0] = 0 and minDist > 1.E-6: + logging.debug("node id moved : %s distance=%s", idNode, minDist) + meshFondFiss.MoveNode(idNode, coordMesh[0] + minCoord[0], coordMesh[1] + minCoord[1], coordMesh[2] + minCoord[2]) + + return meshFondFiss, groups_demiCercles, group_generFiss, nbSegGenLong, nbSegGenBout