Salome HOME
adaptation des tests pour interpolZ sur les groupes de mailles
authorPaul RASCLE <paul.rascle@edf.fr>
Tue, 11 Jul 2017 13:55:05 +0000 (15:55 +0200)
committerPaul RASCLE <paul.rascle@edf.fr>
Tue, 11 Jul 2017 13:55:05 +0000 (15:55 +0200)
doc/salome/examples/h011_normalCaseManualInterpolZ.py
doc/salome/examples/h014_caseDigueManualInterpolZ.py
doc/salome/examples/h015_normalCaseManualTelemac.py
doc/salome/examples/h017_interpolationLineaire.py
doc/salome/examples/h018_streamInterpolation.py
doc/salome/examples/h019_normalCaseManualInterpolZStrickler.py
src/HYDROTools/interpolZ.py

index a91bff698e70dc8286c5820ab3fcadab9d6428c8..ffdd3b129edf3d7986e019a2f7420e7b50d6a013 100644 (file)
@@ -488,9 +488,9 @@ nomCas = 'garonne_1'
 # --- med file 2D(x,y) of the case produced by SMESH
 
 # --- dictionary [med group name] = region name
-dicoGroupeRegion= dict(garonne_1_litMineur  = 'garonne_1_litMineur',
-                       garonne_1_riveDroite = 'garonne_1_riveDroite',
-                       garonne_1_riveGauche = 'garonne_1_riveGauche',
+dicoGroupeRegion= dict(litMineur  = 'garonne_1_litMineur',
+                       riveDroite = 'garonne_1_riveDroite',
+                       riveGauche = 'garonne_1_riveGauche',
                        )
 # --- value to use for Z when the node is not in a region (used to detect problems)
 zUndef = 90
@@ -498,12 +498,12 @@ zUndef = 90
 # --- Z interpolation on the bathymety/altimetry on the mesh nodes
 statz = interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef)
 #print statz
-refstatz = {'garonne_1_riveDroite': (10.88, 32.61, 24.17, 5.12, 17.57, 31.33, 0.25),
-            'garonne_1_riveGauche': (7.72, 71.86, 24.51, 12.18, 12.90, 60.36, 0.25),
-            'garonne_1_litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78)}
+refstatz = {'riveDroite': (10.88, 32.61, 24.17, 5.12, 17.57, 31.33, 0.25),
+            'riveGauche': (7.72, 71.86, 24.51, 12.18, 12.90, 60.36, 0.25),
+            'litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78)}
 controlStatZ(statz, refstatz)
 
 # --- add a field on nodes of type double with z values, named "BOTTOM"
-createZfield2(fichierMaillage)
+#createZfield2(fichierMaillage)
 
 
index 9980a29c75abb6e885c8b80430506f18af5df266..7026406beb6726e3acd6bdc5a1f50b46fdf0055c 100644 (file)
@@ -597,10 +597,10 @@ from salome.hydrotools.controls import controlStatZ
 nomCas = 'garonne_1'
 
 # --- dictionary [med group name] = region name
-dicoGroupeRegion= dict(garonne_1_litMineur  = 'garonne_1_litMineur',
-                       garonne_1_riveDroite = 'garonne_1_riveDroite',
-                       garonne_1_riveGauche = 'garonne_1_riveGauche',
-                       garonne_1_digue      = 'garonne_1_digue',
+dicoGroupeRegion= dict(litMineur  = 'garonne_1_litMineur',
+                       riveDroite = 'garonne_1_riveDroite',
+                       riveGauche = 'garonne_1_riveGauche',
+                       digue      = 'garonne_1_digue',
                        )
 # --- value to use for Z when the node is not in a region (used to detect problems)
 zUndef = 90
@@ -608,11 +608,11 @@ zUndef = 90
 # --- Z interpolation on the bathymety/altimetry on the mesh nodes
 statz = interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef)
 #print statz
-refstatz = {'garonne_1_riveDroite': (10.88, 32.61, 24.09, 5.13, 17.57, 31.33, 0.2),
-            'garonne_1_riveGauche': (7.72, 72.40, 21.59, 8.37, 16.71, 35.71, 0.2),
-            'garonne_1_litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78),
-            'garonne_1_digue': (14.10, 27.09, 22.01, 2.56, 18.15, 25.02)}
+refstatz = {'riveDroite': (10.88, 32.61, 24.09, 5.13, 17.57, 31.33, 0.2),
+            'riveGauche': (7.72, 72.40, 21.59, 8.37, 16.71, 35.71, 0.2),
+            'litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78),
+            'digue': (14.10, 27.09, 22.01, 2.56, 18.15, 25.02)}
 controlStatZ(statz, refstatz)
 
 # --- add a field on nodes of type double with z values, named "BOTTOM"
-createZfield2(fichierMaillage)
+#createZfield2(fichierMaillage)
index d57cb343e2e216fa2e34f7a191fb7b8274221e3d..1929b28c6bdccf21b50537e768ebf6574b4c92a4 100644 (file)
@@ -496,9 +496,9 @@ nomCas = 'garonne_1'
 print 'fichierMaillage=', fichierMaillage
 
 # --- dictionary [med group name] = region name
-dicoGroupeRegion= dict(garonne_1_litMineur  = 'garonne_1_litMineur',
-                       garonne_1_riveDroite = 'garonne_1_riveDroite',
-                       garonne_1_riveGauche = 'garonne_1_riveGauche',
+dicoGroupeRegion= dict(litMineur  = 'garonne_1_litMineur',
+                       riveDroite = 'garonne_1_riveDroite',
+                       riveGauche = 'garonne_1_riveGauche',
                        )
 # --- value to use for Z when the node is not in a region (used to detect problems)
 zUndef = 80
@@ -506,13 +506,13 @@ zUndef = 80
 # --- Z interpolation on the bathymety/altimetry on the mesh nodes
 statz = interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef)
 #print statz
-refstatz = {'garonne_1_riveDroite': (10.88, 32.61, 24.17, 5.12, 17.57, 31.33, 0.25),
-            'garonne_1_riveGauche': (7.72, 71.86, 24.51, 12.18, 12.90, 60.36, 0.25),
-            'garonne_1_litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78)}
+refstatz = {'riveDroite': (10.88, 32.61, 24.17, 5.12, 17.57, 31.33, 0.25),
+            'riveGauche': (7.72, 71.86, 24.51, 12.18, 12.90, 60.36, 0.25),
+            'litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78)}
 controlStatZ(statz, refstatz)
 
 # --- add a field on nodes of type double with z values, named "BOTTOM"
-createZfield2(fichierMaillage)
+#createZfield2(fichierMaillage)
 
 
 #----------------------
index 88e77ad7cfff65f9361b216344466999f00c0f04..46e4e8f69ae9e49480760999192cf56a71227070 100644 (file)
@@ -370,4 +370,4 @@ refstatz = {'domaine': (27.10, 168.28, 91.77, 46.047, 28.637, 161.17)}
 controlStatZ(statz, refstatz)
 
 # --- add a field on nodes of type double with z values, named "BOTTOM"
-createZfield2(fichierMaillage)
+#createZfield2(fichierMaillage)
index 5cda22b9b470af3658246f209d11e012c4737722..4387d2cdc7e96d245540324d9b421dfbe01eb957 100644 (file)
@@ -481,7 +481,7 @@ refstatz = {'riveDroite': (100.0, 100.0, 100.0, 0.0, 100.0, 100.0),
 controlStatZ(statz, refstatz)
 
 # --- add a field on nodes of type double with z values, named "BOTTOM"
-createZfield2(fichierMaillage)
+#createZfield2(fichierMaillage)
 
 
 
index c4442e856bb742f7f0f6cac7a1bae4bc3ae3968c..cad0171baaff647728277808b464a1c812c451bc 100644 (file)
@@ -779,9 +779,9 @@ nomCas = 'garonne_1'
 # --- med file 2D(x,y) of the case produced by SMESH
 
 # --- dictionary [med group name] = region name
-dicoGroupeRegion= dict(garonne_1_litMineur  = 'garonne_1_litMineur',
-                       garonne_1_riveDroite = 'garonne_1_riveDroite',
-                       garonne_1_riveGauche = 'garonne_1_riveGauche',
+dicoGroupeRegion= dict(litMineur  = 'garonne_1_litMineur',
+                       riveDroite = 'garonne_1_riveDroite',
+                       riveGauche = 'garonne_1_riveGauche',
                        )
 # --- value to use for Z when the node is not in a region (used to detect problems)
 zUndef = 90
@@ -789,13 +789,13 @@ zUndef = 90
 # --- Z interpolation on the bathymety/altimetry on the mesh nodes
 statz = interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef)
 #print statz
-refstatz = {'garonne_1_riveDroite': (10.88, 32.61, 24.17, 5.12, 17.57, 31.33, 0.25),
-            'garonne_1_riveGauche': (7.72, 71.86, 24.51, 12.18, 12.90, 60.36, 0.25),
-            'garonne_1_litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78)}
+refstatz = {'riveDroite': (10.88, 32.61, 24.17, 5.12, 17.57, 31.33, 0.25),
+            'riveGauche': (7.72, 71.86, 24.51, 12.18, 12.90, 60.36, 0.25),
+            'litMineur': (2.06, 25.41, 13.93, 4.33, 8.47, 21.78)}
 controlStatZ(statz, refstatz)
 
 # --- add a field on nodes of type double with z values, named "BOTTOM"
-createZfield2(fichierMaillage)
+#createZfield2(fichierMaillage)
 # --- create a field on nodes of type double with srtickler coefficient values, named "BOTTOM FRICTION"
 from salome.hydrotools.interpolS import assignStrickler
 
index ecada786fb70969dd252549f519f7d1dc0795686..94618d7217ed3a0fb93973fdd7cfa0153d1e9e4c 100755 (executable)
@@ -18,12 +18,9 @@ dicoGroupeRegion= dict(litMineur          = 'inondation1_litMineur',
 zUndef = 90
 
 # --- Z interpolation on the bathymety/altimetry on the mesh nodes
-interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef)
-
-# --- add a field on nodes of type double with z values, named "BOTTOM"
-createZfield2(fichierMaillage)
+interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod)
 """
-__revision__ = "V2.01"
+__revision__ = "V2.02"
 # -----------------------------------------------------------------------------
 
 # -----------------------------------------------------------------------------
@@ -155,25 +152,41 @@ class MyInterpolator( HYDROPy.HYDROData_IInterpolator ):
 # -----------------------------------------------------------------------------
 
 
-def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=0, verbose=False):
+def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef=90., interpolMethod=0, zUndefThreshold=-9000., xyzFile=False, verbose=False):
   """
   interpolZ takes a 2D (x,y) mesh and calls the active instance of module HYDRO
   to interpolate the bathymetry/altimetry on the mesh nodes, to produce the Z value of each node.
-  interpolZ must be followed by createZfield1 or createZfield2.
-  nomCas: Calculation Case Name in module HYDRO
-  fichierMaillage: med file name produced by SMESH, corresponding to the HYDRO case
-  dicoGroupeRegion: python dictionary giving the coorespondance of mesh groups to HYDRO regions.
-                    Key: face group name, value: region name in the HYDRO Case
-  zUndef: Z value to use for nodes outside the regions (there must be none if the case is correct).
-  interpolMethod: integer value, default 0 = nearest point on bathymetry, 1 = linear interpolation
-  return <fichierMaillage>Z.med : med file with Z value on nodes
-  return <fichierMaillage>F.med : an exact copy of <fichierMaillage>Z.med
+
+  In:
+    nomCas: Calculation Case Name in module HYDRO
+    fichierMaillage: med file name produced by SMESH, corresponding to the HYDRO case
+    dicoGroupeRegion: python dictionary giving the correspondance of mesh groups to HYDRO regions.
+                      Key: face group name, value: region name in the HYDRO Case
+    zUndef: Z value to use for nodes outside the regions (there must be none if the case is correct).
+                     default value is 90.
+    interpolMethod: integer value
+                    0 = nearest point on bathymetry (default)
+                    1 = linear interpolation
+    zUndef: Z value to use for nodes outside the regions (there must be none if the case is correct).
+    zUndefThreshold: if the interpolated z is under this value, it is replaced by zUndef
+                     default value is -9000.
+    xyzFile: True/False to write an ascii file with xyz for every node. Default is False.
+  Out:
+    statz: statistique for z
+                      Key: face group name, value: (minz, maxz, meanz, stdz, v05z, v95z)
+  Out:
+    return <fichierMaillage>F.med : med file with Z value on nodes and in a field "BOTTOM"
   """
   statz = dict()
   erreur = 0
   message = ""
 
   while not erreur:
+    
+    if verbose:
+      print "interpolMethod: %d" % interpolMethod
+      print "zUndef:", zUndef
+      print "zUndefThreshold: %f" % zUndefThreshold
 
     doc = HYDROPy.HYDROData_Document.Document(theStudyId)
     cas = doc.FindObjectByName(nomCas)
@@ -181,15 +194,14 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=
     custom_inter = MyInterpolator()
 
     basename = fichierMaillage[:-4]
-    fichierZMaillage = basename + 'Z.med'
     fichierFMaillage = basename + 'F.med'
-    fichierFonds = basename + '.xyz'
 
-    print "fichierMaillage  :", fichierMaillage
-    print "fichierZMaillage :", fichierZMaillage
-    print "fichierFMaillage :", fichierFMaillage
-    print "fichierFonds     :", fichierFonds
     print "dicoGroupeRegion =", dicoGroupeRegion
+    print "fichierMaillage  =", fichierMaillage
+    print "fichierFMaillage =", fichierFMaillage
+    if xyzFile:
+      fichierFonds = basename + '.xyz'
+      print "fichierFonds     =", fichierFonds
 #
 # 1. Reads the mesh and gets the number of nodes
 #
@@ -212,12 +224,12 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=
         message += "This group does"
       else:
         message += "That %d groups do" % nb_pb
-      message += " not belongs to the mesh\n"
-      message += "Please check the names of the groups of faces corresponding to each region of the HYDRO case"
+      message += " not belongs to the mesh.\n"
+      message += "Please check the names of the group(s) of faces corresponding to each region of the HYDRO case"
       erreur = 2
       break
 #
-# 3. Get the information about the nodes
+# 3. Gets the information about the nodes
 #
     nbnodes = meshMEDFileRead.getNumberOfNodes()
     if verbose:
@@ -227,15 +239,17 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=
     #print coords
     #print coords[0,0]
     #print coords[0,1]
+#
+# 4. Exploration of every group of faces
 #
     tb_aux = np.zeros(nbnodes, dtype=np.bool)
-    bathy = np.zeros(nbnodes, dtype=np.float)
 #
-# 4. Exploration of every group of faces
+    bathy = np.zeros(nbnodes, dtype=np.float)
+    bathy.fill(zUndef)
 #
     for gr_face_name in l_gr_faces:
 #
-#     4.1. Region
+#     4.1. Region connected to the group
 #
       nomreg = dicoGroupeRegion[gr_face_name]
       line = "------- Region: '" + nomreg + "'"
@@ -253,6 +267,7 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=
         print "\t. Number of cells: %d" % nbr_cells
 #
 #     4.3. Nodes of the meshes of the group
+#          Every node is flagged in tb_aux
 #
       tb_aux.fill(False)
       for id_elem in range(nbr_cells):
@@ -263,7 +278,7 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=
       np_aux = tb_aux.nonzero()
       if len(np_aux[0]):
         if verbose:
-          print "\t. Number of nodes: %d" % len(np_aux[0])
+          print "\t. Number of nodes for this group: %d" % len(np_aux[0])
       #print "np_aux:", np_aux
 #
 #     4.4. Interpolation over the nodes of the meshes of the group
@@ -292,16 +307,18 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=
         ligne += ", v95z: %f" % v95z
         print ligne
 #
-#     4.5. Storage
+#     4.5. Storage of the z and of the statistics for this region
 #
       statz[gr_face_name] = (minz, maxz, meanz, stdz, v05z, v95z)
+#
       for iaux, nodeId in enumerate(np_aux[0]):
         bathy[nodeId] = vz[iaux]
 #
-# 5. Minimum
+# 5. Minimum:
+#    If the value is lower than a threshold, an "undefined" valeur is set
 #
     #print "bathy :\n", bathy
-    np_aux_z = (bathy < -9000.).nonzero()
+    np_aux_z = (bathy < zUndefThreshold).nonzero()
     if verbose:
       print ".. Number of nodes below the minimum: %d" % len(np_aux_z[0])
     if len(np_aux_z[0]):
@@ -310,30 +327,43 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod=
 #
 # 6. xyz file
 #
-    if verbose:
-      print ".. Ecriture du champ de bathymétrie sur le fichier :\n", fichierFonds
-    fo = open(fichierFonds, 'w')
-    for nodeId in range(nbnodes):
-      #maillagePlat.MoveNode(nodeId, x, y, z)
-      line = "%10.2f %10.2f %10.2f\n" % (coords[nodeId, 0], coords[nodeId, 1], bathy[nodeId])
-      fo.write(line)
-    fo.close()
+    if xyzFile:
 #
-# 7 Modification of the z coordinates
+      if verbose:
+        print ".. Ecriture du champ de bathymétrie sur le fichier :\n", fichierFonds
+      fo = open(fichierFonds, 'w')
+      for nodeId in range(nbnodes):
+        line = "%10.2f %10.2f %10.2f\n" % (coords[nodeId, 0], coords[nodeId, 1], bathy[nodeId])
+        fo.write(line)
+      fo.close()
+#
+# 7. Final MED file
+# 7.1. Modification of the z coordinates
 #
     bathy_dd = mc.DataArrayDouble(np.asfarray(bathy, dtype='float'))
     coords3D = DataArrayDouble.Meld([coords, bathy_dd])
     #print "coords3D\n", coords3D
     meshMEDFileRead.setCoords(coords3D)
+#
+# 7.2. Writes the 3D mesh
 #
     if verbose:
-      print ".. Ecriture du maillage 3D sur le fichier :\n", fichierZMaillage
-    meshMEDFileRead.write(fichierZMaillage, 2)
-
-    if verbose:
-      print ".. Ecriture du maillage 3D avec le champ BOTTOM sur le fichier :\n", fichierFMaillage
+      print ".. Ecriture du maillage 3D sur le fichier :\n", fichierFMaillage
     meshMEDFileRead.write(fichierFMaillage, 2)
-
+#
+# 7.3. Writes the field
+#
+    if verbose:
+      print ".. Ecriture du champ BOTTOM"
+    fieldOnNodes=ml.MEDCouplingFieldDouble(ml.ON_NODES, ml.ONE_TIME)
+    fieldOnNodes.setName("BOTTOM")
+    fieldOnNodes.setMesh(meshMEDFileRead.getMeshAtLevel(0))
+    fieldOnNodes.setArray(bathy_dd)
+#
+    fMEDFile_ch_d = ml.MEDFileField1TS()
+    fMEDFile_ch_d.setFieldNoProfileSBT(fieldOnNodes)
+    fMEDFile_ch_d.write(fichierFMaillage, 0)
+#
     break
 
   if erreur: