1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 """Insertion de fissure longue - maillage pipe fond fissure"""
25 from salome.smesh import smeshBuilder
28 from .geomsmesh import geompy
29 from .geomsmesh import smesh
31 from .sortEdges import sortEdges
32 from .putName import putName
33 from .distance2 import distance2
35 def insereFissureLongue_c (pipeFondFiss, disques, rayons, demiCercles, demiCerclesPeau, generatrices, \
36 VerticesEndPipeFiss, verticesEdgePeauFiss, \
37 groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss, \
38 profondeur, rayonPipe, \
40 """maillage pipe fond fissure"""
42 logging.info("Maillage pour le cas n°%s", nro_cas)
44 meshFondFiss = smesh.Mesh(pipeFondFiss)
45 putName(meshFondFiss, "pipeFondFiss", i_pref=nro_cas)
47 algo3d = meshFondFiss.Prism()
48 putName(algo3d.GetSubMesh(), "pipe", i_pref=nro_cas)
49 putName(algo3d, "Prism", i_pref=nro_cas)
51 algo2d = meshFondFiss.Quadrangle(algo=smeshBuilder.QUADRANGLE)
52 putName(algo2d, "QUADRANGLE", i_pref=nro_cas)
54 for i_aux, face in enumerate(disques):
55 algo2d = meshFondFiss.Quadrangle(algo=smeshBuilder.RADIAL_QUAD,geom=face)
56 putName(algo2d.GetSubMesh(), "disque", i_aux, nro_cas)
57 putName(algo2d, "RADIAL_QUAD", i_aux, nro_cas)
59 for i_aux, edge in enumerate(rayons):
60 algo1d = meshFondFiss.Segment(geom=edge)
61 hypo1d = algo1d.NumberOfSegments(4)
62 putName(algo1d.GetSubMesh(), "rayon", i_aux, nro_cas)
63 putName(algo1d, "algo1d_rayon", i_aux, nro_cas)
64 putName(hypo1d, "hypo1d_rayon", i_aux, nro_cas)
66 for i_aux, edge in enumerate(demiCercles):
67 algo1d = meshFondFiss.Segment(geom=edge)
68 hypo1d = algo1d.NumberOfSegments(6)
69 putName(algo1d.GetSubMesh(), "demiCercle", i_aux, nro_cas)
70 putName(algo1d, "algo1d_demiCercle", i_aux, nro_cas)
71 putName(hypo1d, "hypo1d_demiCercle", i_aux, nro_cas)
73 generSorted, minlg, maxlg = sortEdges(generatrices)
74 nbSegGenLong = int(math.sqrt(3.0)*maxlg/(profondeur - rayonPipe)) # on veut 2 triangles equilateraux dans la largeur de la face
76 logging.info("min %s, max %s, nombre de segments %s, nombre de generatrices %s", minlg, maxlg, nbSegGenLong, len(generSorted))
77 for i_aux, edge in enumerate(generSorted):
78 algo1d = meshFondFiss.Segment(geom=edge)
80 hypo1d = algo1d.NumberOfSegments(nbSegGenBout)
82 hypo1d = algo1d.NumberOfSegments(nbSegGenLong)
83 putName(algo1d.GetSubMesh(), "generatrice", i_aux, nro_cas)
84 putName(algo1d, "algo1d_generatrice", i_aux, nro_cas)
85 putName(hypo1d, "hypo1d_generatrice", i_aux, nro_cas)
88 for i_aux, face in enumerate(disques[:4]):
89 name = "disk{}".format(i_aux)
90 disks.append(meshFondFiss.GroupOnGeom(face, name, SMESH.FACE))
91 _ = meshFondFiss.GetMesh().UnionListOfGroups( disks, 'PEAUEXT' )
93 _ = meshFondFiss.GroupOnGeom(VerticesEndPipeFiss[0], "PFOR", SMESH.NODE)
94 _ = meshFondFiss.GroupOnGeom(VerticesEndPipeFiss[1], "PFEX", SMESH.NODE)
96 _ = meshFondFiss.GroupOnGeom(groupFaceFissInPipe, "fisInPi", SMESH.FACE)
97 _ = meshFondFiss.GroupOnGeom(groupEdgeFondFiss, "FONDFISS", SMESH.EDGE)
98 _ = meshFondFiss.GroupOnGeom(groupEdgeFondFiss, "nfondfis", SMESH.NODE)
100 groups_demiCercles = list()
101 groupnodes_demiCercles = list()
102 for i_aux, group in enumerate(groupsDemiCerclesPipe):
103 name = "Cercle{}".format(i_aux)
104 groups_demiCercles.append(meshFondFiss.GroupOnGeom(group, name, SMESH.EDGE))
105 name = "nCercle{}".format(i_aux)
106 groupnodes_demiCercles.append(meshFondFiss.GroupOnGeom(group, name, SMESH.NODE))
107 group_generFiss = meshFondFiss.GroupOnGeom(groupGenerFiss, "GenFiss", SMESH.EDGE)
108 groupnode_generFiss = meshFondFiss.GroupOnGeom(groupGenerFiss, "GenFiss", SMESH.NODE)
110 is_done = meshFondFiss.Compute()
111 text = "meshFondFiss.Compute"
113 logging.info(text+" OK")
115 text = "Erreur au calcul du maillage.\n" + text
117 raise Exception(text)
119 grpNode0 = meshFondFiss.IntersectGroups(groupnode_generFiss, groupnodes_demiCercles[0], "Node0")
120 grpNode1 = meshFondFiss.IntersectGroups(groupnode_generFiss, groupnodes_demiCercles[1], "Node1")
121 idNode0 = grpNode0.GetID(1)
122 idNode1 = grpNode1.GetID(1)
124 coordsMesh.append(meshFondFiss.GetNodeXYZ(idNode0))
125 coordsMesh.append(meshFondFiss.GetNodeXYZ(idNode1))
127 for vertex in verticesEdgePeauFiss:
128 coord = geompy.PointCoordinates(vertex)
129 if distance2(coord, coordsMesh[0]) < 0.1:
130 meshFondFiss.MoveNode(idNode0, coord[0], coord[1], coord[2])
131 if distance2(coord, coordsMesh[1]) < 0.1:
132 meshFondFiss.MoveNode(idNode1, coord[0], coord[1], coord[2])
134 for groupNodes in groupnodes_demiCercles:
135 for idNode in groupNodes.GetListOfID():
136 coordMesh = meshFondFiss.GetNodeXYZ(idNode)
137 vertex = geompy.MakeVertex(coordMesh[0], coordMesh[1], coordMesh[2])
141 for i_aux, edge in enumerate(demiCerclesPeau):
142 discoord = geompy.MinDistanceComponents(vertex, edge)
143 if discoord[0] <minDist:
144 minDist = discoord[0]
145 minCoord = discoord[1:]
147 if imin >= 0 and minDist > 1.E-6:
148 logging.debug("node id moved : %s distance=%s", idNode, minDist)
149 meshFondFiss.MoveNode(idNode, coordMesh[0] + minCoord[0], coordMesh[1] + minCoord[1], coordMesh[2] + minCoord[2])
151 return meshFondFiss, groups_demiCercles, group_generFiss, nbSegGenLong, nbSegGenBout