Salome HOME
Corrections for 9.8
[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, tolerance=0.05):
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   references = {}
32   references['Entity_Node'] = nbNodes
33   references['Entity_Edge'] = nbEdges
34   references['Entity_Triangle'] = nbTriangles
35
36   mesures = aMesh.GetMeshInfo()
37   #print mesures
38   d= {}
39   for key, value in mesures.items():
40     d[str(key)] = value
41   for key in ('Entity_Triangle', 'Entity_Edge', 'Entity_Node'):
42     if (d[key] < (1.0 - tolerance)*references[key]) \
43     or (d[key] > (1.0 + tolerance)*references[key]):
44       print(aMesh.GetName())
45       print(key, ": value: ", d[key], " reference: ", references[key])
46       raise ValueError("Bad number of nodes or elements")
47
48 # -------------------------------------
49
50 def controlSubMeshStats(aSubMesh, nbItems, tolerance=0.05):
51   """
52   Compare number of nodes and elements with a reference,
53   with a precision of 5%.
54   Only for a subMesh, not for a mesh.
55   """
56   mesures = aSubMesh.GetMeshInfo()
57   nbRef = sum(mesures)
58   if (nbItems < (1.0 - tolerance)*nbRef) \
59   or (nbItems > (1.0 + tolerance)*nbRef):
60     print(aSubMesh.GetName())
61     print("value: ", nbRef, " reference: ", nbItems)
62     raise ValueError("Bad number of nodes or elements")
63
64 # -------------------------------------
65
66 def controlStatZ(statz,refstatz):
67   """
68   Compare min, max, mean, standard deviation, percentile 5 and 95 of z of regions with a reference,
69   with a precision of 0.05m by default and 1.0m for min and max.
70   """
71   for nomreg, valsref in refstatz.items():
72     vals = statz[nomreg]
73     tolerance =0.2
74     if len(valsref) > 6:
75       tolerance = valsref[6]
76     if abs(vals[0] - valsref[0]) > 10*tolerance \
77     or abs(vals[1] - valsref[1]) > 10*tolerance \
78     or abs(vals[2] - valsref[2]) > tolerance \
79     or abs(vals[3] - valsref[3]) > tolerance \
80     or abs(vals[4] - valsref[4]) > 10*tolerance \
81     or abs(vals[5] - valsref[5]) > 10*tolerance :
82       print(nomreg)
83       print("value: ", vals)
84       print("reference: ", valsref, "tolerance for mean, std dev: ", tolerance, "and ", 10*tolerance, "for other values")
85       raise ValueError("z interpolation error")
86     else:
87       print(nomreg)
88       print("value: ", vals)
89       print("reference: ", valsref, "tolerance for mean, std dev: ", tolerance, "and ", 10*tolerance, "for other values (0, 1, 4, 5): OK")
90
91 def controlValues(vals, refs, tol = 0.1):
92     """
93     control a list of values against a list of references, with an absolute tolerance
94     """
95     print("values: ", vals)
96     print("references: ", refs)
97     print("tolerance: ", tol)
98     for v,r in zip(vals, refs):
99       if abs(v-r) >tol:
100         print("value: ", v)
101         print("reference: ", r)
102         print("tolerance: ", tol)
103         raise ValueError("value error")
104
105 import MEDLoader
106 from MEDLoader import MEDCouplingFieldDouble, ON_NODES, DataArrayDouble, MEDFileMesh
107 import os, time
108
109 def controlTelemacResult(aMedFile, refs):
110   """
111   Check if the result med file exist and contains result fields
112   """
113   print(aMedFile)
114   for i in range(10):
115     time.sleep(3)
116     print('waiting result...')
117     if os.path.exists(aMedFile):
118       break
119   time.sleep(3)
120   try:
121     MEDLoader.CheckFileForRead(aMedFile)
122   except:
123     raise ValueError("problem while reading Telemac result med file")
124   names = MEDLoader.GetMeshNames(aMedFile)
125   infos = MEDLoader.GetUMeshGlobalInfo(aMedFile, names[0])
126   stats = {}
127   stats['nbTriangles'] = infos[0][0][0][1]
128   stats['nbNodes'] = infos[3]
129   stats['fieldNames'] = MEDLoader.GetNodeFieldNamesOnMesh(aMedFile, names[0])
130   stats['iterations'] = MEDLoader.GetNodeFieldIterations(aMedFile, names[0], stats['fieldNames'][0])
131   for nomreg, valsref in refs.items():
132     vals = stats[nomreg]
133     if vals != valsref:
134       print(nomreg)
135       print("value: ", vals, " reference: ", valsref)
136       raise ValueError("error in Telemac result")
137