Salome HOME
corrections to pass tests
[modules/hydro.git] / doc / salome / examples / h033_completeCaseModifiedRegions.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 = os.path.join(os.environ["HYDRO_DIR"], "bin", "salome", "test", "tmp_test")
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
27
28 hydro_doc = HYDROData_Document.Document()
29
30 offsetX = 430000.
31 offsetY = 6350000.
32 hydro_doc.SetLocalCS( offsetX, offsetY )
33
34 garonne = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "garonne.shp"), 'garonne_PolyXY', True, 2)
35 lit_majeur = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "lit_majeur.shp"), 'lit_majeur_PolyXY', True, 3)
36 ile = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "ile.shp"), 'ile_PolyXY', True, 4)
37 domaine = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "domaine.shp"), 'domaine_PolyXY', False, 5)
38
39 Cloud_02 = importBathymetry(hydro_doc, "Cloud_02", HYDRO_SAMPLES)
40 garonne_point_L93 = importBathymetry(hydro_doc, "garonne_point_L93", HYDRO_SAMPLES)
41
42 litMineur = createImmersibleZone(hydro_doc, "litMineur", garonne[0], Cloud_02, True, 6)
43 litMajeur = createImmersibleZone(hydro_doc, "litMajeur", lit_majeur[0], garonne_point_L93, True, 5)
44 ilot = createImmersibleZone(hydro_doc, "ilot", ile[0], Cloud_02, False, 9)
45 domaineEtendu = createImmersibleZone(hydro_doc, "domaineEtendu", domaine[0], Cloud_02, True, 9)
46
47 # Calculation case
48 casGaronne = hydro_doc.CreateObject( KIND_CALCULATION )
49 casGaronne.SetName( "casGaronne" )
50
51 casGaronne.SetAssignmentMode( HYDROData_CalculationCase.MANUAL )
52 casGaronne.AddGeometryObject( litMineur )
53 casGaronne.AddGeometryObject( domaineEtendu )
54 casGaronne.AddGeometryObject( litMajeur )
55 casGaronne.AddGeometryObject( ilot )
56
57 case_geom_group = domaineEtendu.GetGroup( 0 )
58 casGaronne.AddGeometryGroup( case_geom_group )
59 case_geom_group = litMineur.GetGroup( 0 )
60 casGaronne.AddGeometryGroup( case_geom_group )
61 case_geom_group = litMajeur.GetGroup( 0 )
62 casGaronne.AddGeometryGroup( case_geom_group )
63 casGaronne.SetBoundaryPolyline( domaine[0] )
64
65 # Start the algorithm of the partition and assignment
66 casGaronne.Update()
67 casGaronne_litMineur = hydro_doc.FindObjectByName( "casGaronne_Reg_1" )
68 casGaronne_Zone_1 = hydro_doc.FindObjectByName( "casGaronne_Zone_1" )
69 casGaronne_Zone_1.SetMergeType( HYDROData_Zone.Merge_ZMIN )
70 casGaronne_Zone_1.SetColor( QColor( 192, 113, 64 ))
71 casGaronne_litMineur.AddZone( casGaronne_Zone_1 )
72
73 casGaronne_riveDroite = hydro_doc.FindObjectByName( "casGaronne_Reg_2" )
74 casGaronne_Zone_2 = hydro_doc.FindObjectByName( "casGaronne_Zone_2" )
75 casGaronne_Zone_2.SetMergeType( HYDROData_Zone.Merge_Object )
76 Cloud_02 = hydro_doc.FindObjectByName( "Cloud_02" )
77 casGaronne_Zone_2.SetMergeObject( Cloud_02 )
78 casGaronne_Zone_2.SetColor( QColor( 141, 192, 64 ))
79 casGaronne_riveDroite.AddZone( casGaronne_Zone_2 )
80
81 casGaronne_Zone_3 = hydro_doc.FindObjectByName( "casGaronne_Zone_3" )
82 casGaronne_Zone_3.SetMergeType( HYDROData_Zone.Merge_Object )
83 Cloud_02 = hydro_doc.FindObjectByName( "Cloud_02" )
84 casGaronne_Zone_3.SetMergeObject( Cloud_02 )
85 casGaronne_Zone_3.SetColor( QColor( 64, 192, 77 ))
86 casGaronne_riveDroite.AddZone( casGaronne_Zone_3 )
87
88 casGaronne_riveGauche = hydro_doc.FindObjectByName( "casGaronne_Reg_3" )
89 casGaronne_Zone_4 = hydro_doc.FindObjectByName( "casGaronne_Zone_4" )
90 casGaronne_Zone_4.SetMergeType( HYDROData_Zone.Merge_Object )
91 Cloud_02 = hydro_doc.FindObjectByName( "Cloud_02" )
92 casGaronne_Zone_4.SetMergeObject( Cloud_02 )
93 casGaronne_Zone_4.SetColor( QColor( 64, 75, 192 ))
94 casGaronne_riveGauche.AddZone( casGaronne_Zone_4 )
95
96 casGaronne_Zone_5 = hydro_doc.FindObjectByName( "casGaronne_Zone_5" )
97 casGaronne_Zone_5.SetMergeType( HYDROData_Zone.Merge_Object )
98 Cloud_02 = hydro_doc.FindObjectByName( "Cloud_02" )
99 casGaronne_Zone_5.SetMergeObject( Cloud_02 )
100 casGaronne_Zone_5.SetColor( QColor( 64, 192, 77 ))
101 casGaronne_riveGauche.AddZone( casGaronne_Zone_5 )
102
103 casGaronne_ile = hydro_doc.FindObjectByName( "casGaronne_Reg_4" )
104 casGaronne_Zone_6 = hydro_doc.FindObjectByName( "casGaronne_Zone_6" )
105 casGaronne_Zone_6.SetMergeType( HYDROData_Zone.Merge_ZMAX )
106 casGaronne_Zone_6.SetColor( QColor( 228, 145, 28 ))
107 casGaronne_ile.AddZone( casGaronne_Zone_6 )
108
109 casGaronne_litMineur.SetName("casGaronne_litMineur")
110 casGaronne_riveDroite.SetName("casGaronne_riveDroite")
111 casGaronne_riveGauche.SetName("casGaronne_riveGauche")
112 casGaronne_ile.SetName( "casGaronne_ile" )
113
114 # Export of the calculation case
115 casGaronne_entry = casGaronne.Export()
116
117 #----------------------
118 # --- Geometry
119 #----------------------
120
121 # Get geometry shape and print debug information
122 import GEOM
123 from salome.geom import geomBuilder
124 import math
125 import SALOMEDS
126 from salome.hydrotools.controls import controlGeomProps
127
128 geompy = geomBuilder.New()
129
130 print("Entry:", casGaronne_entry)
131 HYDRO_casGaronne = salome.IDToObject( str( casGaronne_entry ) )
132 print("Geom shape:", HYDRO_casGaronne)
133 print("Geom shape name:", HYDRO_casGaronne.GetName())
134
135 # --- manual definition: geometrical faces
136
137 [garonne_litMineur,garonne_riveDroite,garonne_riveGauche] = geompy.SubShapeAll(HYDRO_casGaronne, geompy.ShapeType["FACE"])
138
139 controlGeomProps(geompy, garonne_riveGauche,  33378.8047,   34595667.2876)
140 controlGeomProps(geompy, garonne_litMineur,   30337.548492,  3488480.304388)
141 controlGeomProps(geompy, garonne_riveDroite,  32012.343241, 25998769.23615)
142
143 # --- manual identification of all useful edge groups (boundary conditions)
144
145 allEdgesIds = geompy.SubShapeAllIDs(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
146 print("allEdgesIds", allEdgesIds)
147
148 (isDone, ClosedFreeBoundary, OpenFreeBoundary) = geompy.GetFreeBoundary(HYDRO_casGaronne)
149 geompy.addToStudyInFather(HYDRO_casGaronne, ClosedFreeBoundary[0], "ClosedFreeBoundary")
150
151 freeBoundary = geompy.ExtractShapes(ClosedFreeBoundary[0], geompy.ShapeType["EDGE"], True)
152 freeBoundaryIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, freeBoundary[i]) for i in range(len(freeBoundary)) ]
153 print("freeBoundaryIds", freeBoundaryIds)
154
155 [litMineur_droite] = geompy.GetSharedShapesMulti([garonne_riveDroite, garonne_litMineur], geompy.ShapeType["EDGE"], True)
156 [litMineur_gauche] = geompy.GetSharedShapesMulti([garonne_riveGauche, garonne_litMineur], geompy.ShapeType["EDGE"], True)
157 geompy.addToStudyInFather(HYDRO_casGaronne, litMineur_droite, "litMineur_droite")
158 geompy.addToStudyInFather(HYDRO_casGaronne, litMineur_gauche, "litMineur_gauche")
159 rives = [litMineur_droite, litMineur_gauche]
160 rivesIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, rives[i]) for i in range(len(rives)) ]
161 print("rivesIds", rivesIds)
162
163 edges_litMineur = geompy.GetSharedShapesMulti([HYDRO_casGaronne, garonne_litMineur], geompy.ShapeType["EDGE"], True)
164 edges_riveGauche = geompy.GetSharedShapesMulti([HYDRO_casGaronne, garonne_riveGauche], geompy.ShapeType["EDGE"], True)
165 edges_riveDroite = geompy.GetSharedShapesMulti([HYDRO_casGaronne, garonne_riveDroite], geompy.ShapeType["EDGE"], True)
166 edges_litMineurIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, edges_litMineur[i]) for i in range(len(edges_litMineur)) ]
167 edges_riveGaucheIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, edges_riveGauche[i]) for i in range(len(edges_riveGauche)) ]
168 edges_riveDroiteIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, edges_riveDroite[i]) for i in range(len(edges_riveDroite)) ]
169
170 print("edges_litMineurIds", edges_litMineurIds)
171 print("edges_riveGaucheIds", edges_riveGaucheIds)
172 print("edges_riveDroiteIds", edges_riveDroiteIds)
173
174 sectionsIds = [Id for Id in edges_litMineurIds if Id not in rivesIds]
175 print("sectionsIds", sectionsIds)
176 SectionsGaronne = geompy.CreateGroup(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
177 geompy.UnionIDs(SectionsGaronne, sectionsIds)
178 geompy.addToStudyInFather(HYDRO_casGaronne, SectionsGaronne, "SectionsGaronne")
179
180 bordGaucheDomaineIds = [Id for Id in freeBoundaryIds if Id in edges_riveGaucheIds]
181 bordDroiteDomaineIds = [Id for Id in freeBoundaryIds if Id in edges_riveDroiteIds]
182 print("bordGaucheDomaineIds", bordGaucheDomaineIds)
183 print("bordDroiteDomaineIds", bordDroiteDomaineIds)
184 bordGaucheDomaine = geompy.CreateGroup(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
185 geompy.UnionIDs(bordGaucheDomaine, bordGaucheDomaineIds)
186 geompy.addToStudyInFather(HYDRO_casGaronne, bordGaucheDomaine, "bordGaucheDomaine")
187 bordDroiteDomaine = geompy.CreateGroup(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
188 geompy.UnionIDs(bordDroiteDomaine, bordDroiteDomaineIds)
189 geompy.addToStudyInFather(HYDRO_casGaronne, bordDroiteDomaine, "bordDroiteDomaine")
190
191 amont = geompy.GetEdgeNearPoint(HYDRO_casGaronne, geompy.MakeVertex(46757.861314, 25833.234752, 0))
192 aval = geompy.GetEdgeNearPoint(HYDRO_casGaronne, geompy.MakeVertex(39078.979127, 32588.627279, 0))
193 geompy.addToStudyInFather(HYDRO_casGaronne, amont, "amont")
194 geompy.addToStudyInFather(HYDRO_casGaronne, aval, "aval")
195
196 #----------------------
197 # --- Meshing
198 #----------------------
199
200 import  SMESH, SALOMEDS
201 from salome.smesh import smeshBuilder
202 from salome.hydrotools.controls import controlMeshStats, controlSubMeshStats
203 import tempfile
204
205 smesh = smeshBuilder.New()
206
207 # --- algorithms and hypothesis
208 garonne_2 = smesh.Mesh(HYDRO_casGaronne)
209
210 NETGEN_2D = garonne_2.Triangle(algo=smeshBuilder.NETGEN_1D2D)
211 NETGEN_2D_Parameters = NETGEN_2D.Parameters()
212 NETGEN_2D_Parameters.SetMaxSize( 200 )
213 NETGEN_2D_Parameters.SetSecondOrder( 0 )
214 NETGEN_2D_Parameters.SetOptimize( 1 )
215 NETGEN_2D_Parameters.SetFineness( 4 )
216 NETGEN_2D_Parameters.SetMinSize( 50 )
217 NETGEN_2D_Parameters.SetUseSurfaceCurvature( 1 )
218 NETGEN_2D_Parameters.SetFuseEdges( 1 )
219 NETGEN_2D_Parameters.SetQuadAllowed( 0 )
220
221 algo2D_litMineur = garonne_2.Quadrangle(algo=smeshBuilder.QUAD_MA_PROJ,geom=garonne_litMineur)
222 algo1D_litMineur = garonne_2.Segment(geom=garonne_litMineur)
223 hypo1D_litMineur = algo1D_litMineur.LocalLength(100,None,1e-07)
224 subMesh_litMineur = algo1D_litMineur.GetSubMesh()
225 smesh.SetName(subMesh_litMineur, "litMineur")
226
227 algo1D_SectionsGaronne = garonne_2.Segment(geom=SectionsGaronne)
228 hypo1D_SectionsGaronne = algo1D_SectionsGaronne.NumberOfSegments(8)
229 hypo1D_SectionsGaronne.SetDistrType( 0 )
230 subMesh_SectionsGaronne = algo1D_SectionsGaronne.GetSubMesh()
231 smesh.SetName(subMesh_SectionsGaronne, "SectionsGaronne")
232
233 isDone = garonne_2.SetMeshOrder( [ [ subMesh_SectionsGaronne, subMesh_litMineur ] ])
234
235 # --- compute mesh
236 isDone = garonne_2.Compute()
237 isDone = garonne_2.SplitQuadObject( garonne_2, 1 )
238 isDone = garonne_2.ReorientObject( garonne_2 )
239
240 # --- geometrical groups of faces
241 riveGauche_1 = garonne_2.GroupOnGeom(garonne_riveGauche,'riveGauche',SMESH.FACE)
242 litMineur_1 = garonne_2.GroupOnGeom(garonne_litMineur,'litMineur',SMESH.FACE)
243 riveDroite_1 = garonne_2.GroupOnGeom(garonne_riveDroite,'riveDroite',SMESH.FACE)
244
245 # --- geometrical groups of edges
246
247 ClosedFreeBoundary_1 = garonne_2.GroupOnGeom(ClosedFreeBoundary[0],'ClosedFreeBoundary',SMESH.EDGE)
248 litMineur_droite_1 = garonne_2.GroupOnGeom(litMineur_droite,'litMineur_droite',SMESH.EDGE)
249 litMineur_gauche_1 = garonne_2.GroupOnGeom(litMineur_gauche,'litMineur_gauche',SMESH.EDGE)
250 Sectionsgaronne_2 = garonne_2.GroupOnGeom(SectionsGaronne,'SectionsGaronne',SMESH.EDGE)
251 bordGaucheDomaine_1 = garonne_2.GroupOnGeom(bordGaucheDomaine,'bordGaucheDomaine',SMESH.EDGE)
252 bordDroiteDomaine_1 = garonne_2.GroupOnGeom(bordDroiteDomaine,'bordDroiteDomaine',SMESH.EDGE)
253 amont_1 = garonne_2.GroupOnGeom(amont,'amont',SMESH.EDGE)
254 aval_1 = garonne_2.GroupOnGeom(aval,'aval',SMESH.EDGE)
255
256 # --- geometrical groups of nodes
257
258 garonne_2_litMineur_2 = garonne_2.GroupOnGeom(garonne_litMineur,'garonne_2_litMineur',SMESH.NODE)
259 garonne_2_riveDroite_2 = garonne_2.GroupOnGeom(garonne_riveDroite,'garonne_2_riveDroite',SMESH.NODE)
260 garonne_2_riveGauche_2 = garonne_2.GroupOnGeom(garonne_riveGauche,'garonne_2_riveGauche',SMESH.NODE)
261 ClosedFreeBoundary_2 = garonne_2.GroupOnGeom(ClosedFreeBoundary[0],'ClosedFreeBoundary',SMESH.NODE)
262 litMineur_droite_2 = garonne_2.GroupOnGeom(litMineur_droite,'litMineur_droite',SMESH.NODE)
263 litMineur_gauche_2 = garonne_2.GroupOnGeom(litMineur_gauche,'litMineur_gauche',SMESH.NODE)
264 SectionsGaronne_2 = garonne_2.GroupOnGeom(SectionsGaronne,'SectionsGaronne',SMESH.NODE)
265 bordGaucheDomaine_2 = garonne_2.GroupOnGeom(bordGaucheDomaine,'bordGaucheDomaine',SMESH.NODE)
266 bordDroiteDomaine_2 = garonne_2.GroupOnGeom(bordDroiteDomaine,'bordDroiteDomaine',SMESH.NODE)
267 amont_2 = garonne_2.GroupOnGeom(amont,'amont',SMESH.NODE)
268 aval_2 = garonne_2.GroupOnGeom(aval,'aval',SMESH.NODE)
269
270 garonne_2.SetAutoColor( 1 )
271 fichierMaillage = os.path.join(HYDRO_TEST_RESOURCES, 'garonne_2.med')
272 garonne_2.ExportMED(fichierMaillage, 0, SMESH.MED_V2_2, 1, None ,1)
273
274 controlMeshStats(garonne_2, 3952, 512, 7690)
275 controlSubMeshStats(litMineur_1, 2384)
276 controlSubMeshStats(riveDroite_1, 2321)
277 controlSubMeshStats(riveGauche_1, 2985)
278
279 if salome.sg.hasDesktop():
280   salome.sg.updateObjBrowser()
281
282 #----------------------
283 # --- HYDRO complete case
284 #----------------------
285
286 constraint2 = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "constraint2.shp"), 'constraint2_PolyXY', True, 5)
287 res = HYDROData_CompleteCalcCase.AddObjects(hydro_doc, casGaronne, constraint2, True)
288 if not res[0]:
289     raise ValueError("complete calculation case unsuccessful")
290 if res[1]:
291     raise ValueError("complete calculation case should not have created new regions")
292
293 regions = casGaronne.GetRegions()
294 for r in regions:
295     print("region: %s" %r.GetName())
296     zones = r.GetZones()
297     for z in zones:
298         print("  zone: %s mergeType: %s" %(z.GetName(), z.GetMergeType()))
299         if z.GetMergeType() == 0:
300             Cloud_02 = hydro_doc.FindObjectByName( "Cloud_02" )
301             z.SetMergeType( HYDROData_Zone.Merge_Object )
302             z.SetMergeObject( Cloud_02 )
303         r.AddZone(z)
304 # casGaronne.Update() # Do not update! Breaks regions!
305
306 casGaronne2_entry = casGaronne.Export()
307
308 # TODO: test something to check the final result
309