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