Salome HOME
fix Lot19, interpolation on a new bathymetry for a mesh group
[modules/hydro.git] / src / HYDROTools / controls.py
index 8f7f3c531475fc4e74b8fd599f3e009403923fa8..921048a49800d1db2e0d1190be7bb0e8e203289a 100644 (file)
@@ -5,20 +5,20 @@
 def controlGeomProps(geompy, geomShape, refLength, refArea):
   """
   compare area and length of a geometric face with a reference,
-  with relative precision of 1.E-3 
+  with relative precision of 1.E-3
   """
   props = geompy.BasicProperties(geomShape)
-  print " Wires length: ", props[0]
-  print " Surface area: ", props[1]
-  print " Volume      : ", props[2]
+  print(" Wires length: ", props[0])
+  print(" Surface area: ", props[1])
+  print(" Volume      : ", props[2])
   deltaLength = 2.0*abs((props[0] - refLength)/(props[0] + refLength))
   deltaArea   = 2.0*abs((props[1] - refArea)/(props[1] + refArea))
   if deltaLength > 1e-3 or deltaArea > 1e-3 or props[2] != 0:
-    print "While must be:"
-    print " Wires length: ", refLength
-    print " Surface area: ", refArea
-    print " Volume      : ", 0.
-    raise ValueError("Bad length or area") 
+    print("While must be:")
+    print(" Wires length: ", refLength)
+    print(" Surface area: ", refArea)
+    print(" Volume      : ", 0.)
+    raise ValueError("Bad length or area")
 
 # -------------------------------------
 
@@ -33,19 +33,19 @@ def controlMeshStats(aMesh, nbNodes, nbEdges, nbTriangles):
   references['Entity_Node'] = nbNodes
   references['Entity_Edge'] = nbEdges
   references['Entity_Triangle'] = nbTriangles
-  
+
   mesures = aMesh.GetMeshInfo()
   #print mesures
   d= {}
-  for key, value in mesures.iteritems():
+  for key, value in mesures.items():
     d[str(key)] = value
   for key in ('Entity_Triangle', 'Entity_Edge', 'Entity_Node'):
     if (d[key] < (1.0 - tolerance)*references[key]) \
     or (d[key] > (1.0 + tolerance)*references[key]):
-      print aMesh.GetName()
-      print key, ": value: ", d[key], " reference: ", references[key]
-      raise ValueError("Bad number of nodes or elements") 
-  
+      print(aMesh.GetName())
+      print(key, ": value: ", d[key], " reference: ", references[key])
+      raise ValueError("Bad number of nodes or elements")
+
 # -------------------------------------
 
 def controlSubMeshStats(aSubMesh, nbItems):
@@ -59,22 +59,68 @@ def controlSubMeshStats(aSubMesh, nbItems):
   nbRef = sum(mesures)
   if (nbItems < (1.0 - tolerance)*nbRef) \
   or (nbItems > (1.0 + tolerance)*nbRef):
-    print aSubMesh.GetName()
-    print "value: ", nbItems, " reference: ", nbRef
-    raise ValueError("Bad number of nodes or elements") 
-  
+    print(aSubMesh.GetName())
+    print("value: ", nbRef, " reference: ", nbItems)
+    raise ValueError("Bad number of nodes or elements")
+
 # -------------------------------------
 
 def controlStatZ(statz,refstatz):
   """
-  Compare min and max of z of regions with a reference,
-  with a precision of 0.05m.
+  Compare min, max, mean, standard deviation, percentile 5 and 95 of z of regions with a reference,
+  with a precision of 0.05m by default and 1.0m for min and max.
   """
-  tolerance = 0.05 # metres
-  for nomreg, valsref in refstatz.iteritems():
+  for nomreg, valsref in refstatz.items():
     vals = statz[nomreg]
-    if abs(vals[0] - valsref[0]) > tolerance \
-    or abs(vals[1] - valsref[1]) > tolerance:
-      print nomreg
-      print "value: ", vals, " reference: ", valsref
-      raise ValueError("z interpolation error") 
+    tolerance =0.1
+    if len(valsref) > 6:
+      tolerance = valsref[6]
+    if abs(vals[0] - valsref[0]) > 10*tolerance \
+    or abs(vals[1] - valsref[1]) > 10*tolerance \
+    or abs(vals[2] - valsref[2]) > tolerance \
+    or abs(vals[3] - valsref[3]) > tolerance \
+    or abs(vals[4] - valsref[4]) > 10*tolerance \
+    or abs(vals[5] - valsref[5]) > 10*tolerance :
+      print(nomreg)
+      print("value: ", vals)
+      print("reference: ", valsref, "tolerance for mean, std dev: ", tolerance, "and ", 10*tolerance, "for other values")
+      raise ValueError("z interpolation error")
+    else:
+      print(nomreg)
+      print("value: ", vals)
+      print("reference: ", valsref, "tolerance for mean, std dev: ", tolerance, "and ", 10*tolerance, "for other values: OK")
+
+
+import MEDLoader
+from MEDLoader import MEDCouplingFieldDouble, ON_NODES, DataArrayDouble, MEDFileMesh
+import os, time
+
+def controlTelemacResult(aMedFile, refs):
+  """
+  Check if the result med file exist and contains result fields
+  """
+  print(aMedFile)
+  for i in range(10):
+    time.sleep(3)
+    print('waiting result...')
+    if os.path.exists(aMedFile):
+      break
+  time.sleep(3)
+  try:
+    MEDLoader.CheckFileForRead(aMedFile)
+  except:
+    raise ValueError("problem while reading Telemac result med file")
+  names = MEDLoader.GetMeshNames(aMedFile)
+  infos = MEDLoader.GetUMeshGlobalInfo(aMedFile, names[0])
+  stats = {}
+  stats['nbTriangles'] = infos[0][0][0][1]
+  stats['nbNodes'] = infos[3]
+  stats['fieldNames'] = MEDLoader.GetNodeFieldNamesOnMesh(aMedFile, names[0])
+  stats['iterations'] = MEDLoader.GetNodeFieldIterations(aMedFile, names[0], 'FREE SURFACE')
+  for nomreg, valsref in refs.items():
+    vals = stats[nomreg]
+    if vals != valsref:
+      print(nomreg)
+      print("value: ", vals, " reference: ", valsref)
+      raise ValueError("error in Telemac result")
+