Salome HOME
Bos #23995 [CEA 24030] ParaView 5.9: fix volumes selection
[modules/smesh.git] / src / Tools / blocFissure / gmu / insereFissureLongue_c.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2020  EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """Insertion de fissure longue - maillage pipe fond fissure"""
21
22 import logging
23 import math
24
25 import salome
26 from salome.smesh import smeshBuilder
27 import SMESH
28
29 from .geomsmesh import geompy
30 from .geomsmesh import smesh
31
32 from .sortEdges import sortEdges
33 from .putName import putName
34 from .distance2 import distance2
35
36 def insereFissureLongue_c (pipeFondFiss, disques, rayons, demiCercles, demiCerclesPeau, generatrices, \
37                            VerticesEndPipeFiss, verticesEdgePeauFiss, \
38                            groupFaceFissInPipe, groupEdgeFondFiss, groupsDemiCerclesPipe, groupGenerFiss, \
39                            profondeur, rayonPipe, \
40                            nro_cas=None):
41   """maillage pipe fond fissure"""
42   logging.info('start')
43   logging.info("Maillage pour le cas n°%s", nro_cas)
44
45   meshFondFiss = smesh.Mesh(pipeFondFiss)
46   putName(meshFondFiss, "pipeFondFiss", i_pref=nro_cas)
47
48   algo2d = meshFondFiss.Quadrangle(algo=smeshBuilder.QUADRANGLE)
49   algo3d = meshFondFiss.Prism()
50   putName(algo3d.GetSubMesh(), "pipe", i_pref=nro_cas)
51   putName(algo3d, "algo3d_pipe", i_pref=nro_cas)
52   putName(algo2d, "algo2d_pipe", i_pref=nro_cas)
53
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, "algo2d_disque", i_aux, nro_cas)
58
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)
65
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)
72
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
75   nbSegGenBout = 6
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)
79     if i_aux < 6:
80       hypo1d = algo1d.NumberOfSegments(nbSegGenBout)
81     else:
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)
86
87   disks = list()
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' )
92
93   _ = meshFondFiss.GroupOnGeom(VerticesEndPipeFiss[0], "PFOR", SMESH.NODE)
94   _ = meshFondFiss.GroupOnGeom(VerticesEndPipeFiss[1], "PFEX", SMESH.NODE)
95
96   _ = meshFondFiss.GroupOnGeom(groupFaceFissInPipe, "fisInPi", SMESH.FACE)
97   _ = meshFondFiss.GroupOnGeom(groupEdgeFondFiss, "FONDFISS", SMESH.EDGE)
98   _ = meshFondFiss.GroupOnGeom(groupEdgeFondFiss, "nfondfis", SMESH.NODE)
99
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)
109
110   is_done = meshFondFiss.Compute()
111   text = "meshFondFiss.Compute"
112   if is_done:
113     logging.info(text+" OK")
114   else:
115     text = "Erreur au calcul du maillage.\n" + text
116     logging.info(text)
117     raise Exception(text)
118
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)
123   coordsMesh = list()
124   coordsMesh.append(meshFondFiss.GetNodeXYZ(idNode0))
125   coordsMesh.append(meshFondFiss.GetNodeXYZ(idNode1))
126
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])
133
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])
138       minDist = 100000
139       minCoord = None
140       imin = -1
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:]
146           imin = i_aux
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])
150
151   return meshFondFiss, groups_demiCercles, group_generFiss, nbSegGenLong, nbSegGenBout