]> SALOME platform Git repositories - modules/hydro.git/blobdiff - src/HYDROTools/interpolZ.py
Salome HOME
Merge remote-tracking branch 'origin/pre/V8_2_BR' into BR_PORTING_OCCT_7
[modules/hydro.git] / src / HYDROTools / interpolZ.py
index d803355bc49c057f5a8325e2bea57168e0e54213..bf6a48eedfea40fb08e4d407d76f44a3e94a0c42 100644 (file)
@@ -14,7 +14,7 @@ dicoGroupeRegion= dict(litMineur          = 'inondation1_litMineur',
                        litMajeurDroite    = 'inondation1_riveDroite',
                        litMajeurGauche    = 'inondation1_riveGauche',
                        )
-# --- value to use for Z when the node is not in a region (used to detect problems)                       
+# --- value to use for Z when the node is not in a region (used to detect problems)
 zUndef = 90
 
 # --- Z interpolation on the bathymety/altimetry on the mesh nodes
@@ -36,6 +36,8 @@ salome.salome_init()
 theStudy = salome.myStudy
 theStudyId = salome.myStudyId
 
+import numpy as np
+
 # -----------------------------------------------------------------------------
 
 from med import medfile
@@ -57,7 +59,7 @@ def createZfield1(fichierMaillage):
   fichierMaillage : 2D (x,y) med file produced by SMESH and used by interpolZ.
   return <fichierMaillage>F.med : med file containing the field "BOTTOM"
   """
-  
+
   noms = string.split(fichierMaillage,'.')
   basename = string.join(noms[:-1], '.')
   fichierFMaillage = basename + 'F.med'
@@ -82,21 +84,21 @@ def createZfield1(fichierMaillage):
     # --- table des numeros des noeuds
     numnoe = medfile.MEDINT(nnoe)
 
-    # --- Lecture des composantes des coordonnees des noeuds 
+    # --- Lecture des composantes des coordonnees des noeuds
     medmesh.MEDmeshNodeCoordinateRd(fid, maa, medenum.MED_NO_DT, medenum.MED_NO_IT,
                                     medenum.MED_FULL_INTERLACE, coords)
     #print "Valeur de coords : ",coords
     valz=medfile.MEDFLOAT([z for (i,z) in enumerate(coords) if i%3==2])
     #print "Valeur de z : ",valz
 
-    # --- creation du champ 
+    # --- creation du champ
     nomcha1 = "BOTTOM"
     ncomp1 = 1
           # --1234567890123456--
     comp1  = "z               "
     unit1  = "m               "
     dtunit = ""
-    medfield.MEDfieldCr(fid, nomcha1, medfile.MED_FLOAT64, 
+    medfield.MEDfieldCr(fid, nomcha1, medfile.MED_FLOAT64,
                         ncomp1, comp1, unit1, dtunit, maa)
 
     # --- ecriture du champ
@@ -106,10 +108,12 @@ def createZfield1(fichierMaillage):
                              medenum.MED_FULL_INTERLACE, medenum.MED_ALL_CONSTITUENT, nnoe, valz)
   # --- fermeture du fichier
   medfile.MEDfileClose(fid)
+  print fichierFMaillage, " field BOTTOM OK"
 
 # -----------------------------------------------------------------------------
 
-from MEDLoader import MEDLoader, MEDCouplingFieldDouble, ON_NODES, DataArrayDouble, MEDFileMesh
+import MEDLoader
+from MEDLoader import MEDCouplingFieldDouble, ON_NODES, DataArrayDouble, MEDFileMesh
 
 def createZfield2(fichierMaillage):
   """
@@ -120,7 +124,7 @@ def createZfield2(fichierMaillage):
   fichierMaillage : 2D (x,y) med file produced by SMESH and used by interpolZ.
   return <fichierMaillage>F.med : med file containing the field "BOTTOM"
   """
-  
+
   noms = string.split(fichierMaillage,'.')
   basename = string.join(noms[:-1], '.')
   fichierZMaillage = basename + 'Z.med'
@@ -135,6 +139,7 @@ def createZfield2(fichierMaillage):
   mm=MEDFileMesh.New(fichierZMaillage)
   mm.write(fichierFMaillage,2)
   MEDLoader.WriteFieldUsingAlreadyWrittenMesh(fichierFMaillage,fieldOnNodes)
+  print fichierFMaillage, " field BOTTOM OK"
 
 # -----------------------------------------------------------------------------
 
@@ -147,7 +152,7 @@ class MyInterpolator( HYDROPy.HYDROData_IInterpolator ):
     #z2 = (z - 74.0)*10
     z2 = z
     return z2
-    
+
 # -----------------------------------------------------------------------------
 
 import SMESH
@@ -156,7 +161,7 @@ from salome.smesh import smeshBuilder
 
 smesh = smeshBuilder.New(theStudy)
 
-def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef):
+def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef, interpolMethod = 0):
   """
   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.
@@ -166,6 +171,7 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef):
   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
   """
@@ -185,18 +191,25 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef):
   print fichierZMaillage
   print fichierFMaillage
   print fichierFonds
-  
+
   regions = {}
   ([maillagePlat], status) = smesh.CreateMeshesFromMED(fichierMaillage)
   groups = maillagePlat.GetGroups()
-  
+
+  grpns = [grp for grp in groups if grp.GetType() == SMESH.NODE]
+  if len(grpns) == 0:
+    print "Problem! There are no groups of nodes in the mesh!"
+    print "Please create at least the groups of nodes corresponding to each region of the HYDRO case"
+    return {}
+
+
   for grp in groups:
     if grp.GetType() == SMESH.NODE:
       grpName = grp.GetName()
       print grpName
       if grpName in dicoGroupeRegion.keys():
         regions[dicoGroupeRegion[grpName]] = grp
-      
+
   fo = open(fichierFonds, 'w')
   statz = {}
   for nomreg, grp in regions.iteritems():
@@ -213,12 +226,17 @@ def interpolZ(nomCas, fichierMaillage, dicoGroupeRegion, zUndef):
       #print xyz
       vx.append(xyz[0])
       vy.append(xyz[1])
-    vz = cas.GetAltitudesForPoints( vx, vy, region )
-    minz = min(vz)
-    maxz = max(vz)
-    statz[grp.GetName()] = (minz, maxz)
-
+    vz = cas.GetAltitudesForPoints( vx, vy, region, interpolMethod )
+    minz = np.amin(vz)
+    maxz = np.amax(vz)
+    meanz = np.mean(vz)
+    stdz = np.std(vz)
+    v05z = np.percentile(vz,05)
+    v95z = np.percentile(vz,95)
     
+    statz[grp.GetName()] = (minz, maxz, meanz, stdz, v05z, v95z)
+
+
     for i,nodeId in enumerate(nodesIds):
       x = vx[i]
       y = vy[i]