Salome HOME
when adjusting a shapefile, modify it's name with a suffix _adj or _split
[modules/hydro.git] / src / HYDROTools / controls.py
1 # -*- coding: utf-8 -*-
2
3 # -------------------------------------
4
5 def controlGeomProps(geompy, geomShape, refLength, refArea):
6   """
7   compare area and length of a geometric face with a reference,
8   with relative precision of 1.E-3
9   """
10   props = geompy.BasicProperties(geomShape)
11   print(" Wires length: ", props[0])
12   print(" Surface area: ", props[1])
13   print(" Volume      : ", props[2])
14   deltaLength = 2.0*abs((props[0] - refLength)/(props[0] + refLength))
15   deltaArea   = 2.0*abs((props[1] - refArea)/(props[1] + refArea))
16   if deltaLength > 1e-3 or deltaArea > 1e-3 or props[2] != 0:
17     print("While must be:")
18     print(" Wires length: ", refLength)
19     print(" Surface area: ", refArea)
20     print(" Volume      : ", 0.)
21     raise ValueError("Bad length or area")
22
23 # -------------------------------------
24
25 def controlMeshStats(aMesh, nbNodes, nbEdges, nbTriangles):
26   """
27   Compare number of nodes and elements with a reference,
28   with a precision of 5%.
29   Only for a mesh, not for a subMesh.
30   """
31   tolerance = 0.05
32   references = {}
33   references['Entity_Node'] = nbNodes
34   references['Entity_Edge'] = nbEdges
35   references['Entity_Triangle'] = nbTriangles
36
37   mesures = aMesh.GetMeshInfo()
38   #print mesures
39   d= {}
40   for key, value in mesures.items():
41     d[str(key)] = value
42   for key in ('Entity_Triangle', 'Entity_Edge', 'Entity_Node'):
43     if (d[key] < (1.0 - tolerance)*references[key]) \
44     or (d[key] > (1.0 + tolerance)*references[key]):
45       print(aMesh.GetName())
46       print(key, ": value: ", d[key], " reference: ", references[key])
47       raise ValueError("Bad number of nodes or elements")
48
49 # -------------------------------------
50
51 def controlSubMeshStats(aSubMesh, nbItems):
52   """
53   Compare number of nodes and elements with a reference,
54   with a precision of 5%.
55   Only for a subMesh, not for a mesh.
56   """
57   tolerance = 0.05
58   mesures = aSubMesh.GetMeshInfo()
59   nbRef = sum(mesures)
60   if (nbItems < (1.0 - tolerance)*nbRef) \
61   or (nbItems > (1.0 + tolerance)*nbRef):
62     print(aSubMesh.GetName())
63     print("value: ", nbRef, " reference: ", nbItems)
64     raise ValueError("Bad number of nodes or elements")
65
66 # -------------------------------------
67
68 def controlStatZ(statz,refstatz):
69   """
70   Compare min, max, mean, standard deviation, percentile 5 and 95 of z of regions with a reference,
71   with a precision of 0.05m by default and 1.0m for min and max.
72   """
73   for nomreg, valsref in refstatz.items():
74     vals = statz[nomreg]
75     tolerance =0.1
76     if len(valsref) > 6:
77       tolerance = valsref[6]
78     if abs(vals[0] - valsref[0]) > 10*tolerance \
79     or abs(vals[1] - valsref[1]) > 10*tolerance \
80     or abs(vals[2] - valsref[2]) > tolerance \
81     or abs(vals[3] - valsref[3]) > tolerance \
82     or abs(vals[4] - valsref[4]) > 10*tolerance \
83     or abs(vals[5] - valsref[5]) > 10*tolerance :
84       print(nomreg)
85       print("value: ", vals)
86       print("reference: ", valsref, "tolerance for mean, std dev: ", tolerance, "and ", 10*tolerance, "for other values")
87       raise ValueError("z interpolation error")
88     else:
89       print(nomreg)
90       print("value: ", vals)
91       print("reference: ", valsref, "tolerance for mean, std dev: ", tolerance, "and ", 10*tolerance, "for other values: OK")
92
93 def controlValues(vals, refs, tol = 0.1):
94     """
95     control a list of values against a list of references, with an absolute tolerance
96     """
97     print("values: ", vals)
98     print("references: ", refs)
99     print("tolerance: ", tol)
100     for v,r in zip(vals, refs):
101       if abs(v-r) >tol:
102         print("value: ", v)
103         print("reference: ", r)
104         print("tolerance: ", tol)
105         raise ValueError("value error")
106
107 import MEDLoader
108 from MEDLoader import MEDCouplingFieldDouble, ON_NODES, DataArrayDouble, MEDFileMesh
109 import os, time
110
111 def controlTelemacResult(aMedFile, refs):
112   """
113   Check if the result med file exist and contains result fields
114   """
115   print(aMedFile)
116   for i in range(10):
117     time.sleep(3)
118     print('waiting result...')
119     if os.path.exists(aMedFile):
120       break
121   time.sleep(3)
122   try:
123     MEDLoader.CheckFileForRead(aMedFile)
124   except:
125     raise ValueError("problem while reading Telemac result med file")
126   names = MEDLoader.GetMeshNames(aMedFile)
127   infos = MEDLoader.GetUMeshGlobalInfo(aMedFile, names[0])
128   stats = {}
129   stats['nbTriangles'] = infos[0][0][0][1]
130   stats['nbNodes'] = infos[3]
131   stats['fieldNames'] = MEDLoader.GetNodeFieldNamesOnMesh(aMedFile, names[0])
132   stats['iterations'] = MEDLoader.GetNodeFieldIterations(aMedFile, names[0], 'FREE SURFACE')
133   for nomreg, valsref in refs.items():
134     vals = stats[nomreg]
135     if vals != valsref:
136       print(nomreg)
137       print("value: ", vals, " reference: ", valsref)
138       raise ValueError("error in Telemac result")
139