Salome HOME
test h032 for complete case with no new region
[modules/hydro.git] / doc / salome / examples / h032_completeCaseNoRegions.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
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.SetColor( QColor( 141, 192, 64 ))
76 casGaronne_riveDroite.AddZone( casGaronne_Zone_2 )
77
78 casGaronne_Zone_3 = hydro_doc.FindObjectByName( "casGaronne_Zone_3" )
79 casGaronne_Zone_3.SetMergeType( HYDROData_Zone.Merge_Object )
80 Cloud_02 = hydro_doc.FindObjectByName( "Cloud_02" )
81 casGaronne_Zone_3.SetMergeObject( Cloud_02 )
82 casGaronne_Zone_3.SetColor( QColor( 64, 192, 77 ))
83 casGaronne_riveDroite.AddZone( casGaronne_Zone_3 )
84
85 casGaronne_riveGauche = hydro_doc.FindObjectByName( "casGaronne_Reg_3" )
86 casGaronne_Zone_4 = hydro_doc.FindObjectByName( "casGaronne_Zone_4" )
87 casGaronne_Zone_4.SetMergeType( HYDROData_Zone.Merge_Object )
88 Cloud_02 = hydro_doc.FindObjectByName( "Cloud_02" )
89 casGaronne_Zone_4.SetMergeObject( Cloud_02 )
90 casGaronne_Zone_4.SetColor( QColor( 64, 75, 192 ))
91 casGaronne_riveGauche.AddZone( casGaronne_Zone_4 )
92
93 casGaronne_Zone_5 = hydro_doc.FindObjectByName( "casGaronne_Zone_5" )
94 casGaronne_Zone_5.SetColor( QColor( 64, 192, 77 ))
95 casGaronne_riveGauche.AddZone( casGaronne_Zone_5 )
96
97 casGaronne_ile = hydro_doc.FindObjectByName( "casGaronne_Reg_4" )
98 casGaronne_Zone_6 = hydro_doc.FindObjectByName( "casGaronne_Zone_6" )
99 casGaronne_Zone_6.SetMergeType( HYDROData_Zone.Merge_ZMAX )
100 casGaronne_Zone_6.SetColor( QColor( 228, 145, 28 ))
101 casGaronne_ile.AddZone( casGaronne_Zone_6 )
102
103 casGaronne_litMineur.SetName("casGaronne_litMineur")
104 casGaronne_riveDroite.SetName("casGaronne_riveDroite")
105 casGaronne_riveGauche.SetName("casGaronne_riveGauche")
106 casGaronne_ile.SetName( "casGaronne_ile" )
107
108 # Export of the calculation case
109 casGaronne_entry = casGaronne.Export()
110
111 #----------------------
112 # --- Geometry
113 #----------------------
114
115 # Get geometry shape and print debug information
116 import GEOM
117 from salome.geom import geomBuilder
118 import math
119 import SALOMEDS
120 from salome.hydrotools.controls import controlGeomProps
121
122 geompy = geomBuilder.New()
123
124 print("Entry:", casGaronne_entry)
125 HYDRO_casGaronne = salome.IDToObject( str( casGaronne_entry ) )
126 print("Geom shape:", HYDRO_casGaronne)
127 print("Geom shape name:", HYDRO_casGaronne.GetName())
128
129 # --- manual definition: geometrical faces
130
131 [garonne_litMineur,garonne_riveDroite,garonne_riveGauche] = geompy.SubShapeAll(HYDRO_casGaronne, geompy.ShapeType["FACE"])
132
133 controlGeomProps(geompy, garonne_riveGauche,  33378.8047,   34595667.2876)
134 controlGeomProps(geompy, garonne_litMineur,   30337.548492,  3488480.304388)
135 controlGeomProps(geompy, garonne_riveDroite,  32012.343241, 25998769.23615)
136
137 # --- manual identification of all useful edge groups (boundary conditions)
138
139 allEdgesIds = geompy.SubShapeAllIDs(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
140 print("allEdgesIds", allEdgesIds)
141
142 (isDone, ClosedFreeBoundary, OpenFreeBoundary) = geompy.GetFreeBoundary(HYDRO_casGaronne)
143 geompy.addToStudyInFather(HYDRO_casGaronne, ClosedFreeBoundary[0], "ClosedFreeBoundary")
144
145 freeBoundary = geompy.ExtractShapes(ClosedFreeBoundary[0], geompy.ShapeType["EDGE"], True)
146 freeBoundaryIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, freeBoundary[i]) for i in range(len(freeBoundary)) ]
147 print("freeBoundaryIds", freeBoundaryIds)
148
149 [litMineur_droite] = geompy.GetSharedShapesMulti([garonne_riveDroite, garonne_litMineur], geompy.ShapeType["EDGE"], True)
150 [litMineur_gauche] = geompy.GetSharedShapesMulti([garonne_riveGauche, garonne_litMineur], geompy.ShapeType["EDGE"], True)
151 geompy.addToStudyInFather(HYDRO_casGaronne, litMineur_droite, "litMineur_droite")
152 geompy.addToStudyInFather(HYDRO_casGaronne, litMineur_gauche, "litMineur_gauche")
153 rives = [litMineur_droite, litMineur_gauche]
154 rivesIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, rives[i]) for i in range(len(rives)) ]
155 print("rivesIds", rivesIds)
156
157 edges_litMineur = geompy.GetSharedShapesMulti([HYDRO_casGaronne, garonne_litMineur], geompy.ShapeType["EDGE"], True)
158 edges_riveGauche = geompy.GetSharedShapesMulti([HYDRO_casGaronne, garonne_riveGauche], geompy.ShapeType["EDGE"], True)
159 edges_riveDroite = geompy.GetSharedShapesMulti([HYDRO_casGaronne, garonne_riveDroite], geompy.ShapeType["EDGE"], True)
160 edges_litMineurIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, edges_litMineur[i]) for i in range(len(edges_litMineur)) ]
161 edges_riveGaucheIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, edges_riveGauche[i]) for i in range(len(edges_riveGauche)) ]
162 edges_riveDroiteIds = [ geompy.GetSubShapeID(HYDRO_casGaronne, edges_riveDroite[i]) for i in range(len(edges_riveDroite)) ]
163
164 print("edges_litMineurIds", edges_litMineurIds)
165 print("edges_riveGaucheIds", edges_riveGaucheIds)
166 print("edges_riveDroiteIds", edges_riveDroiteIds)
167
168 sectionsIds = [Id for Id in edges_litMineurIds if Id not in rivesIds]
169 print("sectionsIds", sectionsIds)
170 SectionsGaronne = geompy.CreateGroup(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
171 geompy.UnionIDs(SectionsGaronne, sectionsIds)
172 geompy.addToStudyInFather(HYDRO_casGaronne, SectionsGaronne, "SectionsGaronne")
173
174 bordGaucheDomaineIds = [Id for Id in freeBoundaryIds if Id in edges_riveGaucheIds]
175 bordDroiteDomaineIds = [Id for Id in freeBoundaryIds if Id in edges_riveDroiteIds]
176 print("bordGaucheDomaineIds", bordGaucheDomaineIds)
177 print("bordDroiteDomaineIds", bordDroiteDomaineIds)
178 bordGaucheDomaine = geompy.CreateGroup(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
179 geompy.UnionIDs(bordGaucheDomaine, bordGaucheDomaineIds)
180 geompy.addToStudyInFather(HYDRO_casGaronne, bordGaucheDomaine, "bordGaucheDomaine")
181 bordDroiteDomaine = geompy.CreateGroup(HYDRO_casGaronne, geompy.ShapeType["EDGE"])
182 geompy.UnionIDs(bordDroiteDomaine, bordDroiteDomaineIds)
183 geompy.addToStudyInFather(HYDRO_casGaronne, bordDroiteDomaine, "bordDroiteDomaine")
184
185 amont = geompy.GetEdgeNearPoint(HYDRO_casGaronne, geompy.MakeVertex(46757.861314, 25833.234752, 0))
186 aval = geompy.GetEdgeNearPoint(HYDRO_casGaronne, geompy.MakeVertex(39078.979127, 32588.627279, 0))
187 geompy.addToStudyInFather(HYDRO_casGaronne, amont, "amont")
188 geompy.addToStudyInFather(HYDRO_casGaronne, aval, "aval")
189
190 #----------------------
191 # --- Meshing
192 #----------------------
193
194 import  SMESH, SALOMEDS
195 from salome.smesh import smeshBuilder
196 from salome.hydrotools.controls import controlMeshStats, controlSubMeshStats
197 import tempfile
198
199 smesh = smeshBuilder.New()
200
201 # --- algorithms and hypothesis
202 garonne_2 = smesh.Mesh(HYDRO_casGaronne)
203
204 NETGEN_2D = garonne_2.Triangle(algo=smeshBuilder.NETGEN_1D2D)
205 NETGEN_2D_Parameters = NETGEN_2D.Parameters()
206 NETGEN_2D_Parameters.SetMaxSize( 200 )
207 NETGEN_2D_Parameters.SetSecondOrder( 0 )
208 NETGEN_2D_Parameters.SetOptimize( 1 )
209 NETGEN_2D_Parameters.SetFineness( 4 )
210 NETGEN_2D_Parameters.SetMinSize( 50 )
211 NETGEN_2D_Parameters.SetUseSurfaceCurvature( 1 )
212 NETGEN_2D_Parameters.SetFuseEdges( 1 )
213 NETGEN_2D_Parameters.SetQuadAllowed( 0 )
214
215 algo2D_litMineur = garonne_2.Quadrangle(algo=smeshBuilder.QUAD_MA_PROJ,geom=garonne_litMineur)
216 algo1D_litMineur = garonne_2.Segment(geom=garonne_litMineur)
217 hypo1D_litMineur = algo1D_litMineur.LocalLength(100,None,1e-07)
218 subMesh_litMineur = algo1D_litMineur.GetSubMesh()
219 smesh.SetName(subMesh_litMineur, "litMineur")
220
221 algo1D_SectionsGaronne = garonne_2.Segment(geom=SectionsGaronne)
222 hypo1D_SectionsGaronne = algo1D_SectionsGaronne.NumberOfSegments(8)
223 hypo1D_SectionsGaronne.SetDistrType( 0 )
224 subMesh_SectionsGaronne = algo1D_SectionsGaronne.GetSubMesh()
225 smesh.SetName(subMesh_SectionsGaronne, "SectionsGaronne")
226
227 isDone = garonne_2.SetMeshOrder( [ [ subMesh_SectionsGaronne, subMesh_litMineur ] ])
228
229 # --- compute mesh
230 isDone = garonne_2.Compute()
231 isDone = garonne_2.SplitQuadObject( garonne_2, 1 )
232 isDone = garonne_2.ReorientObject( garonne_2 )
233
234 # --- geometrical groups of faces
235 riveGauche_1 = garonne_2.GroupOnGeom(garonne_riveGauche,'riveGauche',SMESH.FACE)
236 litMineur_1 = garonne_2.GroupOnGeom(garonne_litMineur,'litMineur',SMESH.FACE)
237 riveDroite_1 = garonne_2.GroupOnGeom(garonne_riveDroite,'riveDroite',SMESH.FACE)
238
239 # --- geometrical groups of edges
240
241 ClosedFreeBoundary_1 = garonne_2.GroupOnGeom(ClosedFreeBoundary[0],'ClosedFreeBoundary',SMESH.EDGE)
242 litMineur_droite_1 = garonne_2.GroupOnGeom(litMineur_droite,'litMineur_droite',SMESH.EDGE)
243 litMineur_gauche_1 = garonne_2.GroupOnGeom(litMineur_gauche,'litMineur_gauche',SMESH.EDGE)
244 Sectionsgaronne_2 = garonne_2.GroupOnGeom(SectionsGaronne,'SectionsGaronne',SMESH.EDGE)
245 bordGaucheDomaine_1 = garonne_2.GroupOnGeom(bordGaucheDomaine,'bordGaucheDomaine',SMESH.EDGE)
246 bordDroiteDomaine_1 = garonne_2.GroupOnGeom(bordDroiteDomaine,'bordDroiteDomaine',SMESH.EDGE)
247 amont_1 = garonne_2.GroupOnGeom(amont,'amont',SMESH.EDGE)
248 aval_1 = garonne_2.GroupOnGeom(aval,'aval',SMESH.EDGE)
249
250 # --- geometrical groups of nodes
251
252 garonne_2_litMineur_2 = garonne_2.GroupOnGeom(garonne_litMineur,'garonne_2_litMineur',SMESH.NODE)
253 garonne_2_riveDroite_2 = garonne_2.GroupOnGeom(garonne_riveDroite,'garonne_2_riveDroite',SMESH.NODE)
254 garonne_2_riveGauche_2 = garonne_2.GroupOnGeom(garonne_riveGauche,'garonne_2_riveGauche',SMESH.NODE)
255 ClosedFreeBoundary_2 = garonne_2.GroupOnGeom(ClosedFreeBoundary[0],'ClosedFreeBoundary',SMESH.NODE)
256 litMineur_droite_2 = garonne_2.GroupOnGeom(litMineur_droite,'litMineur_droite',SMESH.NODE)
257 litMineur_gauche_2 = garonne_2.GroupOnGeom(litMineur_gauche,'litMineur_gauche',SMESH.NODE)
258 SectionsGaronne_2 = garonne_2.GroupOnGeom(SectionsGaronne,'SectionsGaronne',SMESH.NODE)
259 bordGaucheDomaine_2 = garonne_2.GroupOnGeom(bordGaucheDomaine,'bordGaucheDomaine',SMESH.NODE)
260 bordDroiteDomaine_2 = garonne_2.GroupOnGeom(bordDroiteDomaine,'bordDroiteDomaine',SMESH.NODE)
261 amont_2 = garonne_2.GroupOnGeom(amont,'amont',SMESH.NODE)
262 aval_2 = garonne_2.GroupOnGeom(aval,'aval',SMESH.NODE)
263
264 garonne_2.SetAutoColor( 1 )
265 fichierMaillage = os.path.join(HYDRO_TEST_RESOURCES, 'garonne_2.med')
266 garonne_2.ExportMED(fichierMaillage, 0, SMESH.MED_V2_2, 1, None ,1)
267
268 controlMeshStats(garonne_2, 3952, 512, 7690)
269 controlSubMeshStats(litMineur_1, 2384)
270 controlSubMeshStats(riveDroite_1, 2321)
271 controlSubMeshStats(riveGauche_1, 2985)
272
273 if salome.sg.hasDesktop():
274   salome.sg.updateObjBrowser()
275
276
277 #----------------------
278 # --- HYDRO complete case
279 #----------------------
280
281 constraint1 = importPolylines(hydro_doc, os.path.join(HYDRO_SAMPLES, "constraint1.shp"), 'constraint1_PolyXY', True, 5)
282 res = HYDROData_CompleteCalcCase.AddObjects(hydro_doc, casGaronne, constraint1, True)
283 if not res[0]:
284     raise ValueError("complete calculation case unsuccessful")
285 if res[1]:
286     raise ValueError("complete calculation case should not have created new regions")
287
288 casGaronne2_entry = casGaronne.Export()
289
290
291