Salome HOME
f473d80c407f4edf5ea742ff96f41389fe4ff819
[modules/hydro.git] / doc / salome / examples / g027_domaineAmont.py
1 # -*- coding: utf-8 -*-
2
3 import os
4 HYDRO_SAMPLES = os.path.join( os.environ["HYDRO_ROOT_DIR"], "bin/salome/test/HYDRO")
5 HYDRO_TEST_RESOURCES = "/home/paul/testsHydro" #os.environ("HYDRO_TEST_RESOURCES")
6 if not os.path.isdir(HYDRO_TEST_RESOURCES):
7     os.mkdir(HYDRO_TEST_RESOURCES)
8
9 import tempfile
10 tmpdir = tempfile.mkdtemp()
11 print("tmpdir=",tmpdir)
12
13 import sys
14 import salome
15
16 salome.salome_init()
17
18 #----------------------
19 # --- HYDRO
20 #----------------------
21
22 from HYDROPy import *
23 from PyQt5.QtCore import *
24 from PyQt5.QtGui import *
25
26 from salome.hydrotools.hydroGeoMeshUtils import importPolylines, importBathymetry, createImmersibleZone, mergePolylines, getChildrenInStudy
27
28 hydro_doc = HYDROData_Document.Document()
29
30 offsetX = 430000.
31 offsetY = 6350000.
32 hydro_doc.SetLocalCS( offsetX, offsetY )
33
34 limites_amont = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "domaineAmont.shp"), "domaineAmont_PolyXY", False, 4)
35 garonnes_amont = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "garonneAmont.shp"), "garonneAmont_PolyXY", True, 3)
36
37 Cloud_02 = importBathymetry(hydro_doc, "Cloud_02", HYDRO_SAMPLES)
38 garonne_point_L93 = importBathymetry(hydro_doc, "garonne_point_L93", HYDRO_SAMPLES)
39
40 domaine_amont = createImmersibleZone(hydro_doc, "domaine_amont", limites_amont[0], Cloud_02, True, 0)
41 garonne_amont = createImmersibleZone(hydro_doc, "garonne_amont", garonnes_amont[0], garonne_point_L93, True, 0)
42
43 # Calculation case
44 domaineAmont = hydro_doc.CreateObject( KIND_CALCULATION )
45 domaineAmont.SetName( "domaineAmont" )
46
47 domaineAmont.SetAssignmentMode( HYDROData_CalculationCase.MANUAL )
48 domaineAmont.AddGeometryObject( domaine_amont )
49 domaineAmont.AddGeometryObject( garonne_amont )
50
51 case_geom_group = domaine_amont.GetGroup( 0 )
52 domaineAmont.AddGeometryGroup( case_geom_group )
53 case_geom_group = garonne_amont.GetGroup( 0 )
54 domaineAmont.AddGeometryGroup( case_geom_group )
55
56 domaineAmont.SetBoundaryPolyline( limites_amont[0] )
57
58 # Start the algorithm of the partition and assignment
59 domaineAmont.Update()
60 domaineAmont_RiveGauche = hydro_doc.FindObjectByName( "domaineAmont_Reg_1" )
61 domaineAmont_Zone_1 = hydro_doc.FindObjectByName( "domaineAmont_Zone_1" )
62 domaineAmont_Zone_1.SetColor( QColor( 28, 205, 228 ))
63 domaineAmont_RiveGauche.AddZone( domaineAmont_Zone_1 )
64 domaineAmont_LitMineur = hydro_doc.FindObjectByName( "domaineAmont_Reg_2" )
65 domaineAmont_Zone_2 = hydro_doc.FindObjectByName( "domaineAmont_Zone_2" )
66 domaineAmont_Zone_2.SetMergeType( HYDROData_Zone.Merge_ZMIN )
67 domaineAmont_Zone_2.SetColor( QColor( 228, 205, 28 ))
68 domaineAmont_LitMineur.AddZone( domaineAmont_Zone_2 )
69 domaineAmont_RiveDroite = hydro_doc.FindObjectByName( "domaineAmont_Reg_3" )
70 domaineAmont_Zone_3 = hydro_doc.FindObjectByName( "domaineAmont_Zone_3" )
71 domaineAmont_Zone_3.SetColor( QColor( 118, 228, 28 ))
72 domaineAmont_RiveDroite.AddZone( domaineAmont_Zone_3 )
73 domaineAmont_RiveGauche.SetName( "domaineAmont_RiveGauche" )
74 domaineAmont_LitMineur.SetName( "domaineAmont_LitMineur" )
75 domaineAmont_RiveDroite.SetName( "domaineAmont_RiveDroite" )
76
77 # Export of the calculation case
78 domaineAmont_entry = domaineAmont.Export()
79
80 #----------------------
81 # --- Geometry
82 #----------------------
83
84 # Get geometry shape and print debug information
85 import GEOM
86 from salome.geom import geomBuilder
87 import math
88 import SALOMEDS
89 from salome.hydrotools.controls import controlGeomProps
90
91 geompy = geomBuilder.New()
92
93 print ("Entry:", domaineAmont_entry)
94 HYDRO_domaineAmont = salome.IDToObject( str( domaineAmont_entry ) )
95 print ("Geom shape:", HYDRO_domaineAmont)
96 print ("Geom shape name:", HYDRO_domaineAmont.GetName())
97
98 # --- manual definition: geometrical faces
99
100 children = getChildrenInStudy(HYDRO_domaineAmont)
101 garonne_riveGauche = children["domaineAmont_RiveGauche"]
102 garonne_litMineur = children["domaineAmont_LitMineur"]
103 garonne_riveDroite = children["domaineAmont_RiveDroite"]
104 #[garonne_riveGauche, garonne_litMineur, garonne_riveDroite] = geompy.SubShapeAll(HYDRO_domaineAmont, geompy.ShapeType["FACE"])
105
106 controlGeomProps(geompy, garonne_riveGauche,  23924.943383, 19616095.293123)
107 controlGeomProps(geompy, garonne_litMineur,   21175.096223,  2462200.74836)
108 controlGeomProps(geompy, garonne_riveDroite,  21862.960741, 25310128.815573)
109
110 # --- manual identification of all useful edge groups (boundary conditions)
111
112 allEdgesIds = geompy.SubShapeAllIDs(HYDRO_domaineAmont, geompy.ShapeType["EDGE"])
113 print("allEdgesIds", allEdgesIds)
114
115 (isDone, ClosedFreeBoundary, OpenFreeBoundary) = geompy.GetFreeBoundary(HYDRO_domaineAmont)
116 geompy.addToStudyInFather(HYDRO_domaineAmont, ClosedFreeBoundary[0], "ClosedFreeBoundary")
117
118 freeBoundary = geompy.ExtractShapes(ClosedFreeBoundary[0], geompy.ShapeType["EDGE"], True)
119 freeBoundaryIds = [ geompy.GetSubShapeID(HYDRO_domaineAmont, freeBoundary[i]) for i in range(len(freeBoundary)) ]
120 print("freeBoundaryIds", freeBoundaryIds)
121
122 [litMineur_droite] = geompy.GetSharedShapesMulti([garonne_riveDroite, garonne_litMineur], geompy.ShapeType["EDGE"], True)
123 [litMineur_gauche] = geompy.GetSharedShapesMulti([garonne_riveGauche, garonne_litMineur], geompy.ShapeType["EDGE"], True)
124 geompy.addToStudyInFather(HYDRO_domaineAmont, litMineur_droite, "litMineur_droite")
125 geompy.addToStudyInFather(HYDRO_domaineAmont, litMineur_gauche, "litMineur_gauche")
126 rives = [litMineur_droite, litMineur_gauche]
127 rivesIds = [ geompy.GetSubShapeID(HYDRO_domaineAmont, rives[i]) for i in range(len(rives)) ]
128 print("rivesIds", rivesIds)
129
130 edges_litMineur = geompy.GetSharedShapesMulti([HYDRO_domaineAmont, garonne_litMineur], geompy.ShapeType["EDGE"], True)
131 edges_riveGauche = geompy.GetSharedShapesMulti([HYDRO_domaineAmont, garonne_riveGauche], geompy.ShapeType["EDGE"], True)
132 edges_riveDroite = geompy.GetSharedShapesMulti([HYDRO_domaineAmont, garonne_riveDroite], geompy.ShapeType["EDGE"], True)
133 edges_litMineurIds = [ geompy.GetSubShapeID(HYDRO_domaineAmont, edges_litMineur[i]) for i in range(len(edges_litMineur)) ]
134 edges_riveGaucheIds = [ geompy.GetSubShapeID(HYDRO_domaineAmont, edges_riveGauche[i]) for i in range(len(edges_riveGauche)) ]
135 edges_riveDroiteIds = [ geompy.GetSubShapeID(HYDRO_domaineAmont, edges_riveDroite[i]) for i in range(len(edges_riveDroite)) ]
136
137 print("edges_litMineurIds", edges_litMineurIds)
138 print("edges_riveGaucheIds", edges_riveGaucheIds)
139 print("edges_riveDroiteIds", edges_riveDroiteIds)
140
141 sectionsIds = [Id for Id in edges_litMineurIds if Id not in rivesIds]
142 print("sectionsIds", sectionsIds)
143 SectionsGaronne = geompy.CreateGroup(HYDRO_domaineAmont, geompy.ShapeType["EDGE"])
144 geompy.UnionIDs(SectionsGaronne, sectionsIds)
145 geompy.addToStudyInFather(HYDRO_domaineAmont, SectionsGaronne, "SectionsGaronne")
146
147 bordGaucheDomaineIds = [Id for Id in freeBoundaryIds if Id in edges_riveGaucheIds]
148 bordDroiteDomaineIds = [Id for Id in freeBoundaryIds if Id in edges_riveDroiteIds]
149 print("bordGaucheDomaineIds", bordGaucheDomaineIds)
150 print("bordDroiteDomaineIds", bordDroiteDomaineIds)
151 bordGaucheDomaine = geompy.CreateGroup(HYDRO_domaineAmont, geompy.ShapeType["EDGE"])
152 geompy.UnionIDs(bordGaucheDomaine, bordGaucheDomaineIds)
153 geompy.addToStudyInFather(HYDRO_domaineAmont, bordGaucheDomaine, "bordGaucheDomaine")
154 bordDroiteDomaine = geompy.CreateGroup(HYDRO_domaineAmont, geompy.ShapeType["EDGE"])
155 geompy.UnionIDs(bordDroiteDomaine, bordDroiteDomaineIds)
156 geompy.addToStudyInFather(HYDRO_domaineAmont, bordDroiteDomaine, "bordDroiteDomaine")
157
158 amont = geompy.GetEdgeNearPoint(HYDRO_domaineAmont, geompy.MakeVertex(54062.101935, 20486.776236, 0))
159 aval = geompy.GetEdgeNearPoint(HYDRO_domaineAmont, geompy.MakeVertex(47800.17745, 25211,491804, 0))
160 geompy.addToStudyInFather(HYDRO_domaineAmont, amont, "amont")
161 geompy.addToStudyInFather(HYDRO_domaineAmont, aval, "aval")
162
163 #----------------------
164 # --- Meshing
165 #----------------------
166
167 import  SMESH, SALOMEDS
168 from salome.smesh import smeshBuilder
169 from salome.hydrotools.controls import controlMeshStats, controlSubMeshStats
170 import tempfile
171
172 smesh = smeshBuilder.New()
173
174 # --- algorithms and hypothesis
175 garonneAmont = smesh.Mesh(HYDRO_domaineAmont)
176
177 NETGEN_2D = garonneAmont.Triangle(algo=smeshBuilder.NETGEN_1D2D)
178 NETGEN_2D_Parameters = NETGEN_2D.Parameters()
179 NETGEN_2D_Parameters.SetMaxSize( 200 )
180 NETGEN_2D_Parameters.SetSecondOrder( 0 )
181 NETGEN_2D_Parameters.SetOptimize( 1 )
182 NETGEN_2D_Parameters.SetFineness( 4 )
183 NETGEN_2D_Parameters.SetMinSize( 50 )
184 NETGEN_2D_Parameters.SetUseSurfaceCurvature( 1 )
185 NETGEN_2D_Parameters.SetFuseEdges( 1 )
186 NETGEN_2D_Parameters.SetQuadAllowed( 0 )
187
188 algo2D_litMineur = garonneAmont.Quadrangle(algo=smeshBuilder.QUAD_MA_PROJ,geom=garonne_litMineur)
189 algo1D_litMineur = garonneAmont.Segment(geom=garonne_litMineur)
190 hypo1D_litMineur = algo1D_litMineur.LocalLength(100,None,1e-07)
191 subMesh_litMineur = algo1D_litMineur.GetSubMesh()
192 smesh.SetName(subMesh_litMineur, "litMineur")
193
194 algo1D_SectionsGaronne = garonneAmont.Segment(geom=SectionsGaronne)
195 hypo1D_SectionsGaronne = algo1D_SectionsGaronne.NumberOfSegments(8)
196 hypo1D_SectionsGaronne.SetDistrType( 0 )
197 subMesh_SectionsGaronne = algo1D_SectionsGaronne.GetSubMesh()
198 smesh.SetName(subMesh_SectionsGaronne, "SectionsGaronne")
199
200 isDone = garonneAmont.SetMeshOrder( [ [ subMesh_SectionsGaronne, subMesh_litMineur ] ])
201
202 # --- compute mesh
203 isDone = garonneAmont.Compute()
204 isDone = garonneAmont.SplitQuadObject( garonneAmont, 1 )
205 isDone = garonneAmont.ReorientObject( garonneAmont )
206
207 # --- geometrical groups of faces
208 riveGauche_1 = garonneAmont.GroupOnGeom(garonne_riveGauche,'riveGauche',SMESH.FACE)
209 litMineur_1 = garonneAmont.GroupOnGeom(garonne_litMineur,'litMineur',SMESH.FACE)
210 riveDroite_1 = garonneAmont.GroupOnGeom(garonne_riveDroite,'riveDroite',SMESH.FACE)
211
212 # --- geometrical groups of edges
213
214 ClosedFreeBoundary_1 = garonneAmont.GroupOnGeom(ClosedFreeBoundary[0],'ClosedFreeBoundary',SMESH.EDGE)
215 litMineur_droite_1 = garonneAmont.GroupOnGeom(litMineur_droite,'litMineur_droite',SMESH.EDGE)
216 litMineur_gauche_1 = garonneAmont.GroupOnGeom(litMineur_gauche,'litMineur_gauche',SMESH.EDGE)
217 SectionsgaronneAmont = garonneAmont.GroupOnGeom(SectionsGaronne,'SectionsGaronne',SMESH.EDGE)
218 bordGaucheDomaine_1 = garonneAmont.GroupOnGeom(bordGaucheDomaine,'bordGaucheDomaine',SMESH.EDGE)
219 bordDroiteDomaine_1 = garonneAmont.GroupOnGeom(bordDroiteDomaine,'bordDroiteDomaine',SMESH.EDGE)
220 amont_1 = garonneAmont.GroupOnGeom(amont,'amont',SMESH.EDGE)
221 aval_1 = garonneAmont.GroupOnGeom(aval,'aval',SMESH.EDGE)
222
223 # --- geometrical groups of nodes
224
225 garonneAmont_litMineur_2 = garonneAmont.GroupOnGeom(garonne_litMineur,'garonneAmont_litMineur',SMESH.NODE)
226 garonneAmont_riveDroite_2 = garonneAmont.GroupOnGeom(garonne_riveDroite,'garonneAmont_riveDroite',SMESH.NODE)
227 garonneAmont_riveGauche_2 = garonneAmont.GroupOnGeom(garonne_riveGauche,'garonneAmont_riveGauche',SMESH.NODE)
228 ClosedFreeBoundary_2 = garonneAmont.GroupOnGeom(ClosedFreeBoundary[0],'ClosedFreeBoundary',SMESH.NODE)
229 litMineur_droite_2 = garonneAmont.GroupOnGeom(litMineur_droite,'litMineur_droite',SMESH.NODE)
230 litMineur_gauche_2 = garonneAmont.GroupOnGeom(litMineur_gauche,'litMineur_gauche',SMESH.NODE)
231 SectionsgaronneAmont = garonneAmont.GroupOnGeom(SectionsGaronne,'SectionsGaronne',SMESH.NODE)
232 bordGaucheDomaine_2 = garonneAmont.GroupOnGeom(bordGaucheDomaine,'bordGaucheDomaine',SMESH.NODE)
233 bordDroiteDomaine_2 = garonneAmont.GroupOnGeom(bordDroiteDomaine,'bordDroiteDomaine',SMESH.NODE)
234 amont_2 = garonneAmont.GroupOnGeom(amont,'amont',SMESH.NODE)
235 aval_2 = garonneAmont.GroupOnGeom(aval,'aval',SMESH.NODE)
236
237 garonneAmont.SetAutoColor( 1 )
238 fichierMaillage = os.path.join(HYDRO_TEST_RESOURCES, 'garonneAmont.med')
239 garonneAmont.ExportMED(fichierMaillage, 0, SMESH.MED_V2_2, 1, None ,1)
240
241 controlMeshStats(garonneAmont, 2759, 354, 5368)
242 controlSubMeshStats(litMineur_1, 1648)
243 controlSubMeshStats(riveDroite_1, 2018)
244 controlSubMeshStats(riveGauche_1, 1702)
245
246 if salome.sg.hasDesktop():
247   salome.sg.updateObjBrowser()
248