Salome HOME
Bos #23995 [CEA 24030] ParaView 5.9: fix volumes selection
[modules/smesh.git] / src / Tools / blocFissure / gmu / construitFissureGenerale_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 """construction de la fissure générale - maillage"""
21
22 import os
23
24 import logging
25
26 import salome
27 from salome.smesh import smeshBuilder
28 import GEOM
29 import SMESH
30
31 from .geomsmesh import geompy
32 from .geomsmesh import smesh
33
34 from .putName import putName
35 from .enleveDefaut import enleveDefaut
36 from .shapeSurFissure import shapeSurFissure
37 from .regroupeSainEtDefaut import RegroupeSainEtDefaut
38 from .triedreBase import triedreBase
39
40 # -----------------------------------------------------------------------------
41
42 def construitFissureGenerale_c(maillageSain, meshBoiteDefaut, \
43                               zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges, \
44                               facesPortFissure, \
45                               maillageFissureParams, \
46                               mailleur="MeshGems", nro_cas=None):
47   """construction de la fissure générale - maillage"""
48   logging.info('start')
49   logging.info("Usage du mailleur %s pour le cas n°%s", mailleur, nro_cas)
50
51   nomRep            = maillageFissureParams['nomRep']
52   nomFicSain        = maillageFissureParams['nomFicSain']
53   nomFicFissure     = maillageFissureParams['nomFicFissure']
54
55   O, _, _, _ = triedreBase()
56
57   # pour aider l'algo hexa-tetra à ne pas mettre de pyramides à l'exterieur des volumes repliés sur eux-mêmes
58   # on désigne les faces de peau en quadrangles par le groupe "skinFaces"
59   group_faceFissOutPipe = None
60   group_faceFissInPipe = None
61   groups = meshBoiteDefaut.GetGroups()
62   for grp in groups:
63     if grp.GetType() == SMESH.FACE:
64       if grp.GetName() == "fisOutPi":
65         group_faceFissOutPipe = grp
66       elif grp.GetName() == "fisInPi":
67         group_faceFissInPipe = grp
68
69   # le maillage NETGEN ne passe pas toujours ==> on force l'usage de MG_Tetra
70   mailleur = "MeshGems"
71   logging.info("Maillage avec %s", mailleur)
72   if ( mailleur == "MeshGems"):
73     algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.MG_Tetra)
74   else:
75     algo3d = meshBoiteDefaut.Tetrahedron(algo=smeshBuilder.NETGEN)
76     hypo3d = algo3d.MaxElementVolume(1000.0)
77     hypo3d.SetVerboseLevel( 0 )
78     hypo3d.SetStandardOutputLog( 0 )
79     hypo3d.SetRemoveLogOnSuccess( 1 )
80   putName(algo3d.GetSubMesh(), "boiteDefaut", i_pref=nro_cas)
81   putName(algo3d, "algo3d_boiteDefaut", i_pref=nro_cas)
82
83   is_done = meshBoiteDefaut.Compute()
84   text = "meshBoiteDefaut.Compute"
85   if is_done:
86     logging.info(text+" OK")
87   else:
88     text = "Erreur au calcul du maillage.\n" + text
89     logging.info(text)
90     raise Exception(text)
91
92   _ = meshBoiteDefaut.GetMesh().UnionListOfGroups( [ group_faceFissOutPipe, group_faceFissInPipe ], \
93                                                              'FACE1' )
94   maillageSain = enleveDefaut(maillageSain, zoneDefaut, zoneDefaut_skin,
95                               zoneDefaut_internalFaces, zoneDefaut_internalEdges)
96   putName(maillageSain, nomFicSain+"_coupe", i_pref=nro_cas)
97   _, normfiss = shapeSurFissure(facesPortFissure)
98   maillageComplet = RegroupeSainEtDefaut(maillageSain, meshBoiteDefaut, \
99                                          None, None, 'COMPLET', normfiss)
100
101   logging.info("conversion quadratique")
102   maillageComplet.ConvertToQuadratic( 1 )
103   logging.info("groupes")
104   groups = maillageComplet.GetGroups()
105   grps = [ grp for grp in groups if grp.GetName() == 'FONDFISS']
106   _ = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FONDFISS' )
107
108   logging.info("réorientation face de fissure FACE1")
109   grps = [ grp for grp in groups if grp.GetName() == 'FACE1']
110   _ = maillageComplet.Reorient2D( grps[0], normfiss, grps[0].GetID(1))
111
112   logging.info("réorientation face de fissure FACE2")
113   plansim = geompy.MakePlane(O, normfiss, 10000)
114   fissnorm = geompy.MakeMirrorByPlane(normfiss, plansim)
115   grps = [ grp for grp in groups if grp.GetName() == 'FACE2']
116   _ = maillageComplet.Reorient2D( grps[0], fissnorm, grps[0].GetID(1))
117   _ = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' )
118
119   logging.info("export maillage fini")
120   fichierMaillageFissure = os.path.join (nomRep , '{}.med'.format(nomFicFissure))
121   maillageComplet.ExportMED(fichierMaillageFissure)
122   putName(maillageComplet, nomFicFissure)
123   logging.info("fichier maillage fissure %s", fichierMaillageFissure)
124
125   return maillageComplet