Correction d'une faute d'orthographe
[memoirecycle.git] / fluid.py
blob38bcdd393c25e63725533cf22622095db4169fc9
1 import XSteam
2 import math
3 import subprocess
5 class Fluid(object):
6 ''' Template of fluid class, this class is also the None value for fluid '''
7 def __init__(self,project,name):
8 self.__source = None
9 self.__project = project
10 self.__name = name
12 @property
13 def project(self):
14 return self.__project
15 @property
16 def name(self):
17 return self.__name
18 @property
19 def source(self):
20 return self.__source
22 #specific volume [m^3/kg]
23 def vv_p(self,p):
24 return None
25 def vl_p(self,p):
26 return None
27 def vv_T(self,T):
28 return None
29 def vl_T(self,T):
30 return None
31 def v_pT(self,p,T):
32 return None
33 def v_ph(self,p,h):
34 return None
35 def v_ps(self,p,s):
36 return None
37 #Temperature [kelvin]
38 def Tcrit(self):
39 return None
40 def Tsat_p(self,p):
41 return None
42 def T_ph(self,p,h):
43 return None
44 def T_hs(self,h,s):
45 return None
46 #Pressure[Pascal]
47 def pcrit(self):
48 return None
49 def psat_T(self,T):
50 return None
51 def p_hs(self,h,s):
52 return None
53 #Enthalpy[J/kg]
54 def hV_p(self,p):
55 return None
56 def hL_p(self,p):
57 return None
58 def hV_T(self,T):
59 return None
60 def hL_T(self,T):
61 return None
62 def h_pT(self,p,T):
63 return None
64 def h_ps(self,p,s):
65 return None
66 def h_px(self,p,x):
67 return None
68 def h_Tx(self,T,x):
69 return None
70 #Entropy[J/(kg*K)]
71 def sV_p(self,p):
72 return None
73 def sL_p(self,p):
74 return None
75 def sV_T(self,T):
76 return None
77 def sL_T(self,T):
78 return None
79 def s_pT(self,p,T):
80 return None
81 def s_ph(self,p,h):
82 return None
83 #Quality[-]
84 def x_ph(self,p,h):
85 return None
86 def x_ps(self,p,s):
87 return None
90 class FluidXSteam(Fluid):
91 ''' Interface with xsteam fluid'''
92 def __init__(self,project,name):
93 Fluid.__init__(self,project,name)
94 self.__source = 'XSteam'
96 #specific volume
97 def vv_p(self,p):
98 if p != None:
99 p = p/float(1e5)
100 return XSteam.function('vv_p',p,0)
101 else:
102 return None
103 def vl_p(self,p):
104 if p != None:
105 p = p/float(1e5)
106 return XSteam.function('vl_p',p,0)
107 else:
108 return None
109 def vv_T(self,T):
110 if T != None:
111 T = T-273.15
112 return XSteam.function('vv_T',T,0)
113 else:
114 return None
115 def vl_T(self,T):
116 if T != None:
117 T = T-273.15
118 return XSteam.function('vl_T',T,0)
119 else:
120 return None
121 def v_pT(self,p,T):
122 if p != None and T != None:
123 p = p/float(1e5)
124 T = T - 273.15
125 return XSteam.function('v_pT',p,T)
126 else:
127 return None
128 def v_ph(self,p,h):
129 if p != None and h != None:
130 p = p/float(1e5)
131 h = h/float(1e3)
132 return XSteam.function('v_ph',p,h)
133 else:
134 return None
135 def v_ps(self,p,s):
136 if p != None and s != None:
137 p = p/float(1e5)
138 s = s/float(1e3)
139 return XSteam.function('v_ps',p,s)
140 else:
141 return None
143 #Temperature
144 def Tcrit(self):
145 return 373.995+273.15
146 def Tsat_p(self,p):
147 if p != None:
148 p = p/float(1e5)
149 T = XSteam.function('Tsat_p',p,0)
150 return T+273.15
152 else :
153 return None
154 def T_ph(self,p,h):
155 if p != None and h != None:
156 p = p/float(1e5)
157 h = h/float(1e3)
158 T = XSteam.function('T_ph',p,h)
159 return T+273.15
160 else :
161 return None
162 def T_hs(self,h,s):
163 if h != None and s != None:
164 h = h/float(1e3)
165 s = s/float(1e3)
166 T = XSteam.function('T_hs',h,s)
167 return T+273.15
168 else :
169 return None
170 #Pressure
171 def pcrit(self):
172 return 22291500
173 def psat_T(self,T):
174 if T != None :
175 T = T -273.15
176 p = XSteam.function('psat_T',T,0)
177 return p*float(1e5)
178 else :
179 return None
180 def p_hs(self,h,s):
181 if h != None and s != None:
182 h = h/float(1e3)
183 s = s/float(1e3)
184 p = XSteam.function('p_hs',h,s)
185 return p*float(1e5)
186 else :
187 return None
188 #Enthalpy
189 def hV_p(self,p):
190 if p != None:
191 p = p/1e5
192 h = XSteam.function('hV_p',p,0)
193 return h*1e3
194 else:
195 return None
196 def hL_p(self,p):
197 if p != None:
198 p = p/1e5
199 h = XSteam.function('hL_p',p,0)
200 return h*1e3
201 else :
202 return None
203 def hV_T(self,T):
204 if T != None:
205 T = T -273.15
206 h = XSteam.function('hV_T',T,0)
207 return h*1e3
208 else:
209 return None
210 def hL_T(self,T):
211 if T != None:
212 T = T -273.15
213 h = XSteam.function('hL_T',T,0)
214 return h*1e3
215 else:
216 return None
218 def h_pT(self,p,T):
219 if p != None and T != None:
220 p = p/1e5
221 T = T - 273.15
222 h = XSteam.function('h_pT',p,T)
223 return h*1e3
224 else :
225 return None
226 def h_ps(self,p,s):
227 if p != None and s != None:
228 p = p/1e5
229 s = s/1e3
230 h = XSteam.function('h_ps',p,s)
231 return h*1e3
232 else :
233 return None
234 def h_px(self,p,x):
235 if p != None and x != None:
236 p = p/1e5
237 h = XSteam.function('h_px',p,x)
238 return h*1e3
239 else :
240 return None
241 def h_Tx(self,T,x):
242 if T != None and x != None:
243 T = T -273.15
244 h = XSteam.function('h_Tx',T,x)
245 return h*1e3
246 else :
247 return None
249 #Entropy
250 def sV_p(self,p):
251 if p != None:
252 p = p/1e5
253 s= XSteam.function('sV_p',p,0)
254 return s*1e3
255 else:
256 return None
257 def sL_p(self,p):
258 if p != None:
259 p = p/1e5
260 s = XSteam.function('sL_p',p,0)
261 return s*1e3
262 else:
263 return None
264 def sV_T(self,T):
265 if T != None:
266 T = T-273.15
267 s = XSteam.function('sV_T',T,0)
268 return s*1e3
269 else:
270 return None
271 def sL_T(self,T):
272 if T != None:
273 T = T -273.15
274 s = XSteam.function('sL_T',T,0)
275 return s*1e3
276 else:
277 return None
279 def s_pT(self,p,T):
280 if p != None and T != None:
281 p = p/1e5
282 T = T-273.15
283 s = XSteam.function('s_pT',p,T)
284 return s*1e3
285 else :
286 return None
287 def s_ph(self,p,h):
288 if p != None and h != None:
289 p = p/1e5
290 h = h/1e3
291 s = XSteam.function('s_ph',p,h)
292 return s*1e3
293 else :
294 return None
296 #Quality
297 def x_ph(self,p,h):
298 if p != None and h != None :
299 p = p/1e5
300 h = h/1e3
301 x = XSteam.function('x_ph',p,h)
302 return x
303 else :
304 return None
305 def x_ps(self,p,s):
306 if p != None and s != None :
307 p = p/1e5
308 s = s/1e3
309 x = XSteam.function('x_ps',p,s)
310 return x
311 else :
312 return None
314 class RefPropWrapper:
315 def __init__(self):
316 self.dic={}
317 def function(self,f,a,b,fl):
318 if fl not in self.dic:
319 self.dic[fl]=subprocess.Popen(["python","refpropext.py",fl],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
320 self.dic[fl].stdin.write(f+"/"+str(a)+"/"+str(b)+"\n")
321 self.dic[fl].stdin.flush()
322 r=float(self.dic[fl].stdout.readline())
323 return r
324 refprop=RefPropWrapper()
326 class FluidREFPROP(Fluid):
327 '''Interface with REFPROP fluid'''
328 def __init__(self,project,name):
329 Fluid.__init__(self,project,name)
330 self.__source = 'REFPROP'
331 self.__wm = float(refprop.function('wm', 0,0, self.name)/1000.0) # g/mol/1000 => kg/mol
333 # SI -> REFPROP
334 # p [Pa] = p/float(1e3) [kPa]
335 # T [K] = T [K]
336 # h [J/kg] = h/self.__wm [J/mol]
337 # s [J/(kg-K)] = s/self.__wm [J/(mol-K)]
338 # rho [kg/m^3] = rho /1000 /wm [mol/L]
341 #specific volume
342 def vv_p(self,p):
343 if p != None:
344 p = p/float(1e3)
345 return refprop.function('vv_p',p,0,self.name)
346 else:
347 return None
348 def vl_p(self,p):
349 if p != None:
350 p = p/float(1e3)
351 return refprop.function('vl_p',p,0,self.name)
352 else:
353 return None
354 def vv_T(self,T):
355 if T != None:
356 return refprop.function('vv_T',T,0,self.name)
357 else:
358 return None
359 def vl_T(self,T):
360 if T != None:
361 return refprop.function('vl_T',T,0,self.name)
362 else:
363 return None
365 def v_pT(self,p,T):
366 if p != None and T != None:
367 p = p/float(1e3)
368 v = refprop.function('v_pT',p,T,self.name)
369 return v
370 else:
371 return None
372 def v_ph(self,p,h):
373 if p != None and h != None:
374 p = p/float(1e3)
375 h = h*self.__wm
376 v = refprop.function('v_ph',p,h,self.name)
377 return v
378 else:
379 return None
380 def v_ps(self,p,s):
381 if p != None and s != None:
382 p = p/float(1e3)
383 s = s*self.__wm
384 v = refprop.function('v_ps',p,s,self.name)
385 return v
386 else:
387 return None
390 #Temperature K
391 def Tsat_p(self,p):
392 if p != None:
393 p = p/float(1e3)
394 T = refprop.function('Tsat_p',p,0, self.name)
395 return T
396 else :
397 return None
399 def T_ph(self,p,h):
400 if p != None and h != None:
401 p = p/float(1e3)
402 h = h*self.__wm
403 T = refprop.function('T_ph',p,h, self.name)
404 return T
405 else :
406 return None
408 def T_hs(self,h,s):
409 if h != None and s != None:
410 h = h*self.__wm
411 s = s*self.__wm
412 T = refprop.function('T_hs',h,s, self.name)
413 return T
414 else :
415 return None
417 #Pressure
418 def psat_T(self,T):
419 if T != None :
420 p = refprop.function('psat_T',T,0, self.name)
421 return p*1e3
422 else :
423 return None
425 def p_hs(self,h,s):
426 if h != None and s != None:
427 h = h*self.__wm
428 s = s*self.__wm
429 p = refprop.function('p_hs',h,s, self.name)
430 return p*1e3
431 else :
432 return None
434 #Enthalpy
435 def hV_p(self,p):
436 if p != None:
437 p = p/float(1e3)
438 h = refprop.function('hV_p',p,0, self.name)
439 if h != None:
440 return h/self.__wm
441 else:
442 return None
443 else:
444 return None
445 def hL_p(self,p):
446 if p != None:
447 p = p/float(1e3)
448 h = refprop.function('hL_p',p,0, self.name)
449 if h != None:
450 return h/self.__wm
451 else:
452 return None
453 else :
454 return None
455 def hV_T(self,T):
456 if T != None:
457 h = refprop.function('hV_T',T,0, self.name)
458 if h != None:
459 return h/self.__wm
460 else:
461 return None
462 else:
463 return None
464 def hL_T(self,T):
465 if T != None:
466 h = refprop.function('hL_T',T,0, self.name)
467 if h != None:
468 return h/self.__wm
469 else:
470 return None
471 else:
472 return None
473 def h_pT(self,p,T):
474 if p != None and T != None:
475 p = p/float(1e3)
476 h = refprop.function('h_pT',p,T, self.name)
477 return h/self.__wm
478 else :
479 return None
480 def h_ps(self,p,s):
481 if p != None and s != None:
482 p = p/float(1e3)
483 s = s*self.__wm
484 h = refprop.function('h_ps',p,s, self.name)
485 return h/self.__wm
486 else :
487 return None
488 def h_px(self,p,x):
489 if p != None and x != None:
490 p = p/float(1e3)
491 h = refprop.function('h_px',p,x, self.name)
492 return h/self.__wm
493 else :
494 return None
495 def h_Tx(self,T,x):
496 if T != None and x != None:
497 h = refprop.function('h_Tx',T,x, self.name)
498 return h/self.__wm
499 else :
500 return None
502 #Entropy
503 def sV_p(self,p):
504 if p != None:
505 p = p/float(1e3)
506 s = refprop.function('sV_p',p,0, self.name)
507 if s != None:
508 return s/self.__wm
509 else:
510 return None
511 else:
512 return None
513 def sL_p(self,p):
514 if p != None:
515 p = p/float(1e3)
516 s = refprop.function('sL_p',p,0, self.name)
517 if s != None:
518 return s/self.__wm
519 else:
520 return None
522 else:
523 return None
524 def sV_T(self,T):
525 if T != None:
526 s = refprop.function('sV_T',T,0, self.name)
527 if s != None:
528 return s/self.__wm
529 else:
530 return None
532 else:
533 return None
534 def sL_T(self,T):
535 if T != None:
536 s = refprop.function('sL_T',T,0, self.name)
537 if s != None:
538 return s/self.__wm
539 else:
540 return None
542 else:
543 return None
545 def s_pT(self,p,T):
546 if p != None and T != None:
547 p = p/float(1e3)
548 s = refprop.function('s_pT',p,T, self.name)
549 return s/self.__wm
550 else :
551 return None
552 def s_ph(self,p,h):
553 if p != None and h != None:
554 p = p/float(1e3)
555 h = h*self.__wm
556 s = refprop.function('s_ph',p,h, self.name)
557 return s/self.__wm
558 else :
559 return None
561 #Quality
562 def x_ph(self,p,h):
563 if p != None and h != None :
564 p = p/float(1e3)
565 h = h*self.__wm
566 x = refprop.function('x_ph',p,h, self.name)
567 if x == 999.0 :
568 return float('NaN')
569 else:
570 return x
571 else :
572 return None
574 def x_ps(self,p,s):
575 if p != None and s != None :
576 p = p/float(1e3)
577 s = s*self.__wm
578 x = refprop.function('x_ps',p,s, self.name)
579 if x == 999.0 :
580 return float('NaN')
581 else:
582 return x
584 else :
585 return None